【问题标题】:I search for all fields using Elasticsearch, do you know which field matched?我使用 Elasticsearch 搜索所有字段,你知道哪个字段匹配吗?
【发布时间】:2017-05-06 11:32:30
【问题描述】:

我使用 Elasticsearch 搜索所有字段,你知道哪个字段匹配吗?

PUT my_index/user/1 
{
  "first_name":    "John",
  "last_name":     "Smith",
  "date_of_birth": "1970-10-24"
}

GET my_index/_search
{
  "query": {
    "match": {
      "_all": "john 1970"
    }
  }
}

在上面的示例中,搜索“john 1970”的所有字段。 由于 put 文档匹配“first_name”和“date_of_birth”,因此它作为结果返回。

我怎么知道它匹配“first_name”和“date_of_birth”?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    问题是_all 是一个字段,在索引时将所有其他字段的所有值复制到该字段中。具体来说,当你索引你的文档时,ES 在概念上看到的是这个(尽管源没有被修改为包含 _all_all 本身没有被存储,只是被索引):

    {
      "first_name":    "John",
      "last_name":     "Smith",
      "date_of_birth": "1970-10-24",
      "_all": "john smith 1970 10 24"
    }
    

    因此,如果您与 _all 匹配,那么唯一可以匹配的字段是 _all 本身,没有办法仅根据 _all “逆向工程”哪个字段包含哪个匹配值。

    但是,您可以使用另一个称为突出显示的功能。由于_all 字段未存储,因此无法突出显示,但其他字段可以,因此您可以突出显示哪些原始字段与哪些值匹配:

    {
      "query": {
        "match": {
          "_all": "john 1970"
        }
      },
      "highlight": {
        "fields": {
          "*": {
            "require_field_match": false
          }
        }
      }
    }
    

    在响应中,您会看到类似这样的内容,表明 first_name 与查询匹配。

    "highlight": {
      "first_name": [
        "<em>John</em>"
      ]
    }
    

    【讨论】:

    • 非常感谢。非常有帮助。 Elasticsearch 最近用的遍地都是,所以你不明白的东西满满当当。看来工作比今天结束得早。
    • 我很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2021-11-05
    • 2013-09-12
    • 1970-01-01
    • 2021-08-18
    • 2018-12-22
    相关资源
    最近更新 更多