弹性搜索精确匹配查询问题
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"
}
}
}
]
}
}
}
我在 bool 查询中使用了三个匹配查询和一个范围查询。我的目的是获取与这些完全匹配且在此日期范围内的文档。在这里,如果我更改名称和类型值,我不会得到结果。但是对于 productId,如果我只输入 ff134be8,我会得到结果。任何人都知道这是为什么? .完全匹配适用于名称和类型,但不适用于 productId
您需要将 productId 的映射设置为 keyword
以避免标记化。使用标准分词器 "ff134be8-10fc-4461-b620-79s51199c7qb"
将创建 ["ff134be8", "10fc", "4461", "b620", "79s51199c7qb"]
作为分词。
您有不同的选择:
1/ 使用一个term query 不分析字段内容进行检查
...
{
"term": {
"productId": "ff134be8-10fc-4461-b620-79s51199c7qb"
}
},
...
2/ 如果您在 Elasticsearch 6.X 中,您可以将您的请求更改为
...
{
"match": {
"productId.keyword": "ff134be8-10fc-4461-b620-79s51199c7qb"
}
},
...
因为 elasticsearch 将为所有字符串字段
创建一个类型为 keyword
的子字段 keyword
最好的选择当然是第一个。如果您尝试匹配确切的内容,请始终使用 term query
。
我在查询弹性搜索时遇到问题。以下是我的查询
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
您需要将 productId 的映射设置为 keyword
以避免标记化。使用标准分词器 "ff134be8-10fc-4461-b620-79s51199c7qb"
将创建 ["ff134be8", "10fc", "4461", "b620", "79s51199c7qb"]
作为分词。
您有不同的选择:
1/ 使用一个term query 不分析字段内容进行检查
...
{
"term": {
"productId": "ff134be8-10fc-4461-b620-79s51199c7qb"
}
},
...
2/ 如果您在 Elasticsearch 6.X 中,您可以将您的请求更改为
...
{
"match": {
"productId.keyword": "ff134be8-10fc-4461-b620-79s51199c7qb"
}
},
...
因为 elasticsearch 将为所有字符串字段
创建一个类型为keyword
的子字段 keyword
最好的选择当然是第一个。如果您尝试匹配确切的内容,请始终使用 term query
。