首页 > 解决方案 > Elasticsearch 6.3 在关键字字段中使用空格查询并且不返回所有文档

问题描述

我有一个映射的休闲部分:

"name": {
    "store": "true",
    "type": "keyword"
}

这个查询:

{
    "query":{
        "query_string":{
            "query":"+(name:John Doe)",
            "fields":[

            ]
        }
    },
    "aggregations":{

        "name":{
            "terms":{
                "field":"name",
                "size":10
            }
        }
    }
}

该查询应该返回 100 多个结果,但它只返回几个。如果我像这样向 John Doe 添加引号:\"John Doe\",那么它会返回所有所需的结果。

我想知道为什么会这样。将字段映射为关键字以便整体分析 John Doe 并且不应该添加引号还不够吗?另外,为什么它会返回更少的没有引号的项目?

注意:在 ES 1.4 中,相同的查询似乎可以正常工作(尽管说实话不是相同的数据,并且它使用构面而不是聚合)。

标签: elasticsearch

解决方案


查询文档query string明确指出:

如果该字段是一个keyword字段,分析器将创建一个单独的术语...

因此,您无需在搜索字符串中添加引号。相反,您需要正确编写查询。目前,您的查询尝试John在字段中查找术语name,并Doe所有其他字段中查找术语!因此,您必须通过以下方式之一重写您的查询:

  1. 为您的搜索词添加括号,以便查询解析器可以“理解”必须在name字段中找到所有单词:

    {
        "query": {
            "query_string": {
                "query": "+(name:(John Doe))",
                "fields": [
    
                ]
            }
        },
        "aggregations": {
            "name": {
                "terms": {
                    "field": "name",
                    "size": 10
                }
            }
        }
    }
    
  2. fields在数组中而不是在查询字符串中指定字段名称:

    {
        "query": {
            "query_string": {
                "query": "+(John Doe)",
                "fields": [
                    "name"
                ]
            }
        },
        "aggregations": {
            "name": {
                "terms": {
                    "field": "name",
                    "size": 10
                }
            }
        }
    }
    

推荐阅读