我在查询弹性搜索时遇到问题。以下是我的查询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
1 回答
白猪掌柜的
TA贡献1893条经验 获得超10个赞
您需要设置 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如果您试图匹配确切的内容,请始终使用。
添加回答
举报
0/150
提交
取消