AWS ElasticSearch - 匹配查询不工作

问题描述 投票:0回答:1

我已经通过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部署了一个弹性搜索实例。

elasticsearch full-text-search aws-elasticsearch
1个回答
1
投票

由于你没有提供你的映射,看你的问题,似乎在你的映射中。Dest 字段定义为 keyword 因此,存储的是 Verona Villafranca Airport 会被原样存储。

当你使用 匹配查询 意味着它使用了与字段索引相同的分析器,这将是 keyword 在这种情况下,因此搜索 Verona Villafranca Airport 返回结果为倒置索引中的这个标记,同时搜索 Verona 不会匹配任何标记,因此你不会得到任何结果。

解决方法:如果你想进行不区分大小写的搜索,并且想在 Veronaairport,那么你需要定义这个 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
        }
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.