繁体   English   中英

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

[英]Elastic search exact match query issue

查询弹性搜索时出现问题。 以下是我的查询

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"
                    }
                }
            }

        ]
    }
}
}

我在布尔查询中使用三个匹配查询和一个范围查询。 我的意图是获取具有这些确切匹配且在此日期范围内的文档。 在这里,如果我更改名称和类型值,我将无法获得结果。 但是对于productId,如果我只输入ff134be8,我会得到结果。 有人知道为什么吗? 完全匹配适用于名称和类型,但不适用于productId

您需要将productId设置为keyword的映射,以避免标记化。 使用标准令牌生成器"ff134be8-10fc-4461-b620-79s51199c7qb"将创建["ff134be8", "10fc", "4461", "b620", "79s51199c7qb"]作为令牌。

您有不同的选择:

1 /使用术语查询来检查而不分析字段内容

...
    {
        "term": {
            "productId": "ff134be8-10fc-4461-b620-79s51199c7qb"
        }
    },
    ...

2 /如果您使用的是Elasticsearch 6.X,则可以将请求更改为

...
{
    "match": {
        "productId.keyword": "ff134be8-10fc-4461-b620-79s51199c7qb"
    }
},
...

由于elasticsearch将为所有字符串字段创建一个带有type keyword的subfield keyword

最好的选择当然是第一个。 如果您要匹配确切的内容,请始终使用term query

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM