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 将不会匹配任何标记,因此您不会得到任何结果。

解决方法:如果你想要不区分大小写的搜索并且想在Veronaairport上搜索,那么你需要将这个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
        }
    ]
}