AWS ElasticSearch - 匹配查询不工作
AWS ElasticSearch - Match Query Not Working
我已经通过 AWS 托管的 ElasticSearch 服务(版本 7.4.2)部署了一个弹性搜索实例,但无法使 "match" 查询正常工作。我正在使用示例航班数据集和 运行 以下查询:
数据:
[
{
"FlightNum": "HX0WBLI",
"DestCountry": "IT",
"OriginWeather": "Damaging Wind",
"OriginCityName": "Chitose / Tomakomai",
"AvgTicketPrice": 988.8975638746068,
"DistanceMiles": 5650.511340218511,
"FlightDelay": false,
"DestWeather": "Sunny",
"Dest": "Verona Villafranca Airport"
},
{
"FlightNum": "VG7H7U4",
"DestCountry": "IT",
"OriginWeather": "Cloudy",
"OriginCityName": "Milan",
"AvgTicketPrice": 223.66801608639728,
"DistanceMiles": 78.45850223819446,
"FlightDelay": false,
"DestWeather": "Sunny",
"Dest": "Verona Villafranca Airport"
},
{
"FlightNum": "B3CVVO3",
"DestCountry": "IT",
"OriginWeather": "Cloudy",
"OriginCityName": "Sydney",
"AvgTicketPrice": 360.41688271717148,
"DistanceMiles": 10207.122317757072,
"FlightDelay": false,
"DestWeather": "Rain",
"Dest": "Verona Villafranca Airport"
}
]
查询:
POST kibana_sample_data_flights/_search
{
"query": {
"match":{
"Dest": "Verona"
}
}
}
我知道有些项目应该部分匹配,但我得到一个空的结果集。指定完整值 "Verona Villafranca Airport" 会产生一些结果。是否需要启用某些功能才能使上述查询正常工作?
对于本地实例(通过 docker 部署),同样的查询也按预期工作。
感谢您的帮助!
由于您没有提供您的映射并查看您的问题,似乎在您的映射中,Dest
字段被定义为 keyword
未被分析。因此存储 Verona Villafranca Airport
将按原样存储。
当您使用 match query which is analyzed 时,意味着它使用与索引字段相同的分析器,在这种情况下为 keyword
,因此搜索 Verona Villafranca Airport
returns 结果是这个标记出现在倒排索引中,而搜索 Verona
将不会匹配任何标记,因此您不会得到任何结果。
解决方法:如果你想要不区分大小写的搜索并且想在Verona
或airport
上搜索,那么你需要将这个Dest
字段定义为text
并且Elasticsearch 默认使用 standard
分析器,它会自动将文本小写并拆分为空格,这将启用上述搜索条件。
稍后您可以使用您正在使用的相同 match
查询,它将按照文档中的说明工作。
关于 match
来自文档的查询的注释
Returns documents that match a provided text, number, date or boolean
value. The provided text is analyzed before matching.
标准分析器生成的令牌
POST /_analyze
{
"text" : "Verona Villafranca Airport",
"analyzer" : "standard"
}
{
"tokens": [
{
"token": "verona",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "villafranca",
"start_offset": 7,
"end_offset": 18,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "airport",
"start_offset": 19,
"end_offset": 26,
"type": "<ALPHANUM>",
"position": 2
}
]
}
关键字生成的令牌
POST /_analyze
{
"text" : "Verona Villafranca Airport",
"analyzer" : "keyword"
}
{
"tokens": [
{
"token": "Verona Villafranca Airport",
"start_offset": 0,
"end_offset": 26,
"type": "word",
"position": 0
}
]
}
我已经通过 AWS 托管的 ElasticSearch 服务(版本 7.4.2)部署了一个弹性搜索实例,但无法使 "match" 查询正常工作。我正在使用示例航班数据集和 运行 以下查询:
数据:
[
{
"FlightNum": "HX0WBLI",
"DestCountry": "IT",
"OriginWeather": "Damaging Wind",
"OriginCityName": "Chitose / Tomakomai",
"AvgTicketPrice": 988.8975638746068,
"DistanceMiles": 5650.511340218511,
"FlightDelay": false,
"DestWeather": "Sunny",
"Dest": "Verona Villafranca Airport"
},
{
"FlightNum": "VG7H7U4",
"DestCountry": "IT",
"OriginWeather": "Cloudy",
"OriginCityName": "Milan",
"AvgTicketPrice": 223.66801608639728,
"DistanceMiles": 78.45850223819446,
"FlightDelay": false,
"DestWeather": "Sunny",
"Dest": "Verona Villafranca Airport"
},
{
"FlightNum": "B3CVVO3",
"DestCountry": "IT",
"OriginWeather": "Cloudy",
"OriginCityName": "Sydney",
"AvgTicketPrice": 360.41688271717148,
"DistanceMiles": 10207.122317757072,
"FlightDelay": false,
"DestWeather": "Rain",
"Dest": "Verona Villafranca Airport"
}
]
查询:
POST kibana_sample_data_flights/_search
{
"query": {
"match":{
"Dest": "Verona"
}
}
}
我知道有些项目应该部分匹配,但我得到一个空的结果集。指定完整值 "Verona Villafranca Airport" 会产生一些结果。是否需要启用某些功能才能使上述查询正常工作?
对于本地实例(通过 docker 部署),同样的查询也按预期工作。
感谢您的帮助!
由于您没有提供您的映射并查看您的问题,似乎在您的映射中,Dest
字段被定义为 keyword
未被分析。因此存储 Verona Villafranca Airport
将按原样存储。
当您使用 match query which is analyzed 时,意味着它使用与索引字段相同的分析器,在这种情况下为 keyword
,因此搜索 Verona Villafranca Airport
returns 结果是这个标记出现在倒排索引中,而搜索 Verona
将不会匹配任何标记,因此您不会得到任何结果。
解决方法:如果你想要不区分大小写的搜索并且想在Verona
或airport
上搜索,那么你需要将这个Dest
字段定义为text
并且Elasticsearch 默认使用 standard
分析器,它会自动将文本小写并拆分为空格,这将启用上述搜索条件。
稍后您可以使用您正在使用的相同 match
查询,它将按照文档中的说明工作。
关于 match
来自文档的查询的注释
Returns documents that match a provided text, number, date or boolean value. The provided text is analyzed before matching.
标准分析器生成的令牌
POST /_analyze
{
"text" : "Verona Villafranca Airport",
"analyzer" : "standard"
}
{
"tokens": [
{
"token": "verona",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "villafranca",
"start_offset": 7,
"end_offset": 18,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "airport",
"start_offset": 19,
"end_offset": 26,
"type": "<ALPHANUM>",
"position": 2
}
]
}
关键字生成的令牌
POST /_analyze
{
"text" : "Verona Villafranca Airport",
"analyzer" : "keyword"
}
{
"tokens": [
{
"token": "Verona Villafranca Airport",
"start_offset": 0,
"end_offset": 26,
"type": "word",
"position": 0
}
]
}