【问题标题】:AWS ElasticSearch - Match Query Not WorkingAWS ElasticSearch - 匹配查询不起作用
【发布时间】:2020-04-23 17:32:08
【问题描述】:

我已通过 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 部署),同样的查询也可以正常工作。

感谢您的帮助!

【问题讨论】:

  • 你能发布你的索引的映射吗?
  • 发布的示例数据。
  • 问题可能出在映射中。发布GET kibana_sample_data_flights/_mapping的输出
  • 您好,感谢您跟进并回答我的问题。相信你是对的,我去看看索引上的配置再确认。

标签: elasticsearch full-text-search aws-elasticsearch


【解决方案1】:

由于您尚未提供映射并查看您的问题,因此在您的映射中,Dest 字段被定义为 keyword,未进行分析。因此存储Verona Villafranca Airport 将按原样存储。

当您使用match query which is analyzed 时,意味着它使用用于索引字段的相同分析器,在这种情况下为keyword,因此搜索Verona Villafranca Airport 会返回结果,因为此标记存在于倒排索引中,搜索 Verona 时不会匹配任何令牌,因此您不会得到任何结果。

解决方案:如果您想要不区分大小写的搜索并希望在 Veronaairport 上进行搜索,则需要将此 Dest 字段定义为 text 并且 Elasticsearch 默认使用 standard 分析器将自动小写并在空白处拆分文本,这将启用上述搜索条件。

稍后您可以使用与您正在使用的相同的 match 查询,它会按照文档中的说明工作。

关于来自文档的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
        }
    ]
}

【讨论】:

  • 感谢您的详细回答。正如您提到的,有问题的属性被设置为关键字,这就是我看到这种行为的原因。
猜你喜欢
  • 2018-04-10
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2017-07-08
相关资源
最近更新 更多