一尘不染

在elasticsearch中的字符串数组中搜索精确字段

elasticsearch

Elasticsearch版本:7.1.1

嗨,我做了很多尝试,但是在索引中找不到任何解决方案,我有一个包含字符串的字段。

因此,例如,我有两个文档,它们在locations数组中包含不同的值。

文件1:

"doc" : {
            "locations" : [
              "Cloppenburg",
              "Berlin"
           ]
       }

文件2:

"doc" : {
                "locations" : [
                  "Landkreis Cloppenburg",
                  "Berlin"
                ]
              }

用户请求搜索术语 克洛彭堡, 而我只想返回那些包含术语 克洛彭堡 而不是 Landkreis Cloppenburg的
文档。结果应仅包含 Document-1 。但是我的查询返回了两个文档。

我正在使用以下查询,并同时获取两个文档。有人可以帮我吗

GET /my_index/_search
     {
        "query": {
            "bool": {
                "must": [
                    {
                        "match": {
                            "doc.locations": {
                                "query": "cloppenburg",
                                "operator": "and"
                            }
                        }
                    }
                ]
            }
        }
    }

阅读 1611

收藏
2020-06-22

共1个答案

一尘不染

问题是由于您正在使用该text字段和match查询。

对匹配查询进行分析,并使用与索引时使用的搜索词相同的分析器,对于字段,这是标准分析器text。在您的情况下,如果在空白处打断文本,Landkreis Cloppenburg将创建两个标记landkreiscloppenburg同时创建索引和搜索时间,甚至cloppenburg匹配文档。

解决方案:使用keyword field

索引定义

{
    "mappings": {
        "properties": {
            "location": {
                "type": "keyword"
            }
        }
    }
}

为两个文档建立索引,然后使用相同的搜索查询

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "location": {
                            "query": "Cloppenburg"
                        }
                    }
                }
            ]
        }
    }

}

结果

 "hits": [
            {
                "_index": "location",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.6931471,
                "_source": {
                    "location": "Cloppenburg"
                }
            }
        ]
2020-06-22