弹性搜索完全匹配查询问题

我在查询弹性搜索时遇到问题。以下是我的查询


GET _search {

"query": {

    "bool": {

        "must": [{

                "match": {

                    "name": "SomeName"

                }

            },

            {

                "match": {

                    "type": "SomeType"

                }

            },

            {

                "match": {

                    "productId": "ff134be8-10fc-4461-b620-79s51199c7qb"

                }

            },

            {

                "range": {

                    "request_date": {

                        "from": "2018-08-22T12:16:37,392",

                        "to": "2018-08-28T12:17:41,137",

                        "format": "YYYY-MM-dd'T'HH:mm:ss,SSS"

                    }

                }

            }


        ]

    }

}

}

我在 bool 查询中使用了三个匹配查询和一个范围查询。我的目的是获取与这些完全匹配并在此日期范围内的文档。在这里,如果我更改名称和类型值,则不会得到结果。但是对于 productId ,如果我只输入 ff134be8,我会得到结果。有谁知道这是为什么?. 精确匹配适用于名称和类型,但不适用于 productId


慕哥9229398
浏览 146回答 1
1回答

白猪掌柜的

您需要设置 productId 的映射keyword以避免标记化。使用标准标记器"ff134be8-10fc-4461-b620-79s51199c7qb"将创建["ff134be8", "10fc", "4461", "b620", "79s51199c7qb"]为标记。您有不同的选择:1/ 使用term查询进行检查,不分析字段内容...    {        "term": {            "productId": "ff134be8-10fc-4461-b620-79s51199c7qb"        }    },    ...2/ 如果您使用的是 Elasticsearch 6.X,您可以将您的请求更改为...{    "match": {        "productId.keyword": "ff134be8-10fc-4461-b620-79s51199c7qb"    }},...由于 elasticsearch 将创建一个keyword类型keyword为所有字符串字段的子字段最好的选择当然是第一个。term query如果您试图匹配确切的内容,请始终使用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java