与Elasticsearch中的IN运算符完全匹配

时间:2018-11-04 15:00:33

标签: elasticsearch elastic-stack elasticsearch-5 aws-elasticsearch

如何使用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]
               }
            }
         ]
      }
   }
}

1 个答案:

答案 0 :(得分:1)

这是因为您的字段name的类型为text

当数据类型为text时,Elasticsearch将值(例如The GeorgeGeorge 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 GeorgeGeorge Washington转换为the georgegeorge washtingon,然后将它们按原样存储在倒排索引中。

您可能会得到您提到的查询,然后按预期工作。

希望有帮助!