0

如何使用 IN 操作找到多个文本值的完全匹配?例如,

SELECT * WHERE name in ('george','michael') AND testID in (1,2)

当我尝试在查询下运行时,它会返回匹配值的额外数据,例如“乔治”,而不是仅作为“乔治”的确切值

{  
   "query":{  
      "bool":{  
         "filter":[  
            {  
               "query_string":{  
                  "fields":[  
                     "name"
                  ],
                  "query":"george or michael"
               }
            },
            {  
               "terms":{  
                  "testID":[1,2]
               }
            }
         ]
      }
   }
}
4

1 回答 1

1

那是因为您的字段name是 type text

当数据类型为 if 时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 Washingtonthe georgegeorge washtingon,然后将它们按原样存储在倒排索引中。

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

希望能帮助到你!

于 2018-11-04T17:52:43.023 回答