【问题标题】:exact match with IN Operator in elasticsearch与弹性搜索中的 IN 运算符完全匹配
【发布时间】:2018-11-04 15:00:33
【问题描述】:

如何通过 IN 操作找到多个文本值的精确匹配?例如,

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

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

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

【问题讨论】:

  • 你能发布你的映射吗?

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


【解决方案1】:

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

当数据类型为 text 时,Elasticsearch 会将值(例如 The GeorgeGeorge Washington 分解为标记 [the, george][george, washington] 并将这些标记保存在倒排索引中。因此,当您在此字段上搜索时使用您的查询,它也会返回这些文档,即您所说的不完全匹配。

为了完全匹配,我建议您使用lowercase 规范器使用keyword 类型,如下图所示:

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,然后将它们按原样存储在倒排索引中。

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

希望对你有帮助!

【讨论】:

  • Kamal,在搜索或更新索引中的文档时,添加规范化器会对整个索引产生任何性能影响?
  • 它只会影响我认为可以接受的索引过程 afaik。请记住,如果您还打算拥有partial matching,您可能需要为您的领域实施multi-fieldelastic.co/guide/en/elasticsearch/reference/current/…
猜你喜欢
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多