我正在将查询发送到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”时”。

在这种查询中,我只想接收名称为“tony(first_name)lopez(last_name)”的句段

我该如何解决该问题?

最佳答案

希望我不会太早得出结论,但是如果您只想将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

如果只想获得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

希望能帮助到你

09-07 20:01