为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥9229398 2021-08-13 17:19:06
我在查询弹性搜索时遇到问题。以下是我的查询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如果您试图匹配确切的内容,请始终使用。


查看完整回答
反对 回复 2021-08-13
  • 1 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信