与 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 GeorgeGeorge 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 GeorgeGeorge Washington转换为the georgegeorge washtingon,然后将它们原样存储在倒排索引中。

您提到的查询可能会按预期工作。

希望对您有所帮助!