如何使用IN操作查找多个文本值的精确匹配?例如
SELECT * WHERE name in ('george','michael') AND testID in (1,2)
当我尝试在查询下面运行时,它会返回额外的数据以匹配值,例如“ 乔治”,而不是仅作为“ george ”的确切值< / p>
{
"query":{
"bool":{
"filter":[
{
"query_string":{
"fields":[
"name"
],
"query":"george or michael"
}
},
{
"terms":{
"testID":[1,2]
}
}
]
}
}
}
答案 0 :(得分:1)
这是因为您的字段name
的类型为text
。
当数据类型为text
时,Elasticsearch将值(例如The George
或George Washington
分解为令牌[the, george]
或[george, washington]
并将这些令牌反向保存索引。因此,当您使用查询在此字段上进行搜索时,它还会返回这些文档,即您所说的不完全匹配。
对于完全匹配,我建议您使用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
,然后将它们按原样存储在倒排索引中。
您可能会得到您提到的查询,然后按预期工作。
希望有帮助!