我已经通过AWS`托管的ElasticSearch服务(版本7.4.2)部署了一个弹性搜索实例,但在 "匹配 "查询方面遇到了麻烦。我正在使用样本航班数据集并运行以下查询。
数据:
[
{
"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部署)中也能正常工作。
谢谢你的帮助!我已经通过docker部署了一个弹性搜索实例。
由于你没有提供你的映射,看你的问题,似乎在你的映射中。Dest
字段定义为 keyword
因此,存储的是 Verona Villafranca Airport
会被原样存储。
当你使用 匹配查询 意味着它使用了与字段索引相同的分析器,这将是 keyword
在这种情况下,因此搜索 Verona Villafranca Airport
返回结果为倒置索引中的这个标记,同时搜索 Verona
不会匹配任何标记,因此你不会得到任何结果。
解决方法:如果你想进行不区分大小写的搜索,并且想在 Verona
或 airport
,那么你需要定义这个 Dest
领域为 text
而Elasticsearch使用的是 standard
分析器的默认情况下,它将自动小写和分割文本的空白处,这将使上述搜索条件。
而以后你也可以使用同样的 match
查询,你正在使用,它将按照docs中的解释工作。
注意 match
询盘
返回与提供的文本、数字、日期或布尔值相匹配的文档。提供的文本在匹配前会被分析。
由标准分析器生成的标记
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
}
]
}