Elastic Search多重匹配结果错误

时间:2019-11-14 09:55:46

标签: java jquery json elasticsearch

我正在向Elastic Search发送查询,以查找具有与查询匹配的字段的所有段。 我们正在实现“免费搜索”功能,用户可以编写自己想要的任何文本,并且我们构建了一个查询,该搜索将该文本引发所有细分字段。 其中一个(或多个)字段具有此文本的每个细分均应返回

例如:

我想获取所有名称为“ tony lopez”的细分。 每个段都有一个“ first_name”字段和一个“ last_name”字段。

我们的服务建立的查询:

  "multi_match" : {
    "query": "tony lopez",
    "type": "best_fields"
    "fields": [],
    "operator": "OR"
  }

Elastic使用此查询得到的结果是一个段,其中包括“ first_name”字段“ tony”和“ last_name”字段“ lopez”,还包括一个当“ first_name”字段为“ joe”和“ last_name”时的段是“紧张”。

在这种查询中,我只想检索其名称为“ tony(first_name)lopez(last_name)”的段

如何解决该问题?

1 个答案:

答案 0 :(得分:2)

希望我不会太早得出结论,但是如果您只想使用tonylopez作为名字和姓氏,请使用以下命令:

GET my_index/_search
{
  "query": { 
   "bool": {
     "must": [
       {
         "match": {
           "first": "tony"
         }
       },
       {
         "match": {
           "last": "lopez"
         }
       }
     ]
   }
  }
}

但是,如果您的索引文档之一包含tony s作为名字,则上面的查询也将返回它。

为什么? firstnametext数据类型

  

一个用于索引全文值的字段,例如电子邮件的正文或产品的描述。对这些字段进行分析,即将它们通过分析器传递,以在将其编入索引之前将字符串转换为单个术语的列表。

More Details

如果您通过kibana运行此查询:

POST my_index/_analyze
{
  "field": "first", 
  "text": ["tony s"]
}

您将看到tony s被分析为两个标记tonys

  

通过分析器将字符串转换为单个术语的列表(术语为tony,术语为s)。

这就是为什么上面的查询返回结果tony s,它与tony相匹配的原因。

如果您只想获得tonylopez完全匹配,则应使用以下查询:

GET my_index/_search
{
  "query": { 
   "bool": {
     "must": [
       {
         "term": {
           "first.keyword": {
             "value": "tony"
           }
         }
       },
       {
         "term": {
           "last.keyword": {
             "value": "lopez"
           }
         }
       }
     ]
   }
  }
}

Read about keyword datatype

更新

尝试执行此查询-与我的tony s示例不是完全相同的问题,如果您有一个姓氏lopez和姓氏tony的文档,它将找到它。

GET my_index/_search
{
  "query": { 
   "multi_match": {
     "query": "tony lopez",
     "fields": [],
     "type": "cross_fields",
     "operator":"AND",
     "analyzer":   "standard"

   }
  }
}
  

cross_fields类型对于多个字段应该匹配的结构化文档特别有用。例如,当查询first_name和last_name字段中的“ Will Smith”时,最匹配的一个字段可能是“ Will”,另一个字段中是“ Smith”

cross fields

希望有帮助