与 elasticsearch 中的 IN 运算符完全匹配
exact match with IN Operator in elasticsearch
如何通过IN操作找到多个文本值的精确匹配?例如,
SELECT * WHERE name in ('george','michael') AND testID in (1,2)
当我尝试 运行 下面的查询时,它 returns 用于匹配值的额外数据,例如“the george”,而不是用于精确值仅作为“乔治”
{
"query":{
"bool":{
"filter":[
{
"query_string":{
"fields":[
"name"
],
"query":"george or michael"
}
},
{
"terms":{
"testID":[1,2]
}
}
]
}
}
}
那是因为你的字段 name
的类型是 text
。
当数据类型为 text
时,Elasticsearch 将值(例如 The George
或 George Washington
分解为标记 [the, george]
或 [george, washington]
并保存这些标记在倒排索引中。因此,当您使用查询在该字段上进行搜索时,它也会 return 这些文档 i.e.what 您说的不完全匹配。
对于完全匹配,我建议您使用 keyword
类型和 lowercase
规范化器,如下面的映射所述:
PUT <your_index_name>
{
"settings":{
"analysis":{
"normalizer":{
"my_custom_normalizer":{
"type":"custom",
"filter":[
"lowercase"
]
}
}
}
},
"mappings":{
"mydocs":{
"properties":{
"name":{
"type":"keyword",
"normalizer":"my_custom_normalizer"
}
}
}
}
}
通过这样做,您的值将按原样保存,例如基于上面的映射,它将The George
或George Washington
转换为the george
或george washtingon
,然后将它们原样存储在倒排索引中。
您提到的查询可能会按预期工作。
希望对您有所帮助!
如何通过IN操作找到多个文本值的精确匹配?例如,
SELECT * WHERE name in ('george','michael') AND testID in (1,2)
当我尝试 运行 下面的查询时,它 returns 用于匹配值的额外数据,例如“the george”,而不是用于精确值仅作为“乔治”
{
"query":{
"bool":{
"filter":[
{
"query_string":{
"fields":[
"name"
],
"query":"george or michael"
}
},
{
"terms":{
"testID":[1,2]
}
}
]
}
}
}
那是因为你的字段 name
的类型是 text
。
当数据类型为 text
时,Elasticsearch 将值(例如 The George
或 George Washington
分解为标记 [the, george]
或 [george, washington]
并保存这些标记在倒排索引中。因此,当您使用查询在该字段上进行搜索时,它也会 return 这些文档 i.e.what 您说的不完全匹配。
对于完全匹配,我建议您使用 keyword
类型和 lowercase
规范化器,如下面的映射所述:
PUT <your_index_name>
{
"settings":{
"analysis":{
"normalizer":{
"my_custom_normalizer":{
"type":"custom",
"filter":[
"lowercase"
]
}
}
}
},
"mappings":{
"mydocs":{
"properties":{
"name":{
"type":"keyword",
"normalizer":"my_custom_normalizer"
}
}
}
}
}
通过这样做,您的值将按原样保存,例如基于上面的映射,它将The George
或George Washington
转换为the george
或george washtingon
,然后将它们原样存储在倒排索引中。
您提到的查询可能会按预期工作。
希望对您有所帮助!