【问题标题】:How can I get per-document significant terms aggregations in Elasticsearch?如何在 Elasticsearch 中获取每个文档的重要术语聚合?
【发布时间】:2020-04-09 02:08:28
【问题描述】:

在 Elasticsearch 中,我的索引具有以下定义的字段:

"my_id": {
    "type": "keyword"
},
"titles": {
    "type": "keyword",
     "fields": {
          "fulltext": {
              "type": "text"
          }
     }
}

我为每个文档存储多个titles(基本上是一个字符串数组)。

假设我用以下内容索引一个文档:

  • my_id = "MH123"
  • titles = [“星球大战:新希望”、“星球大战:绝地归来”、“星球大战:“帝国反击战”]

我想根据每个文档 ID 返回 significant_terms 聚合。比如……

  • 其中 my_id = "MH123"
  • 重要的术语是:“星球大战”

我知道如何使用significant_terms 聚合 文档执行此操作。但是,我无法让它在文档的子聚合上工作。

我尝试在存储桶中创建一个存储桶,第一个存储桶在 ID 上进行分区,内部存储桶返回重要术语。重要术语返回一个空数组。

{
    "aggs": {
        "titles": {
            "terms": {
                "field": "my_id"
            },
            "aggs": {
                "my_common_terms": {
                    "significant_terms": {
                        "field": "titles"
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    重要术语 aggs 与您的预期相反 - 他们正在寻找 unusual occurrences,而不是最常用的术语!

    例子:

    PUT stars
    {"mappings":{"properties":{"my_id":{"type":"keyword"},"titles":{"type":"keyword","fields":{"fulltext":{"type":"text"}}}}}}
    

    然后索引一些具有相似 ID 的文档

    POST stars/_doc
    {
      "my_id": "MH123",
      "titles": [
        "Star Wars: A New Hope",
        "Star Wars: Return of the Jedi",
        "Star Wars: \"Empire Strikes Back\""
      ]
    }
    
    POST stars/_doc
    {
      "my_id": "MH124",
      "titles": [
        "Star Wars: A New Hope",
        "Star Wars: Return of the Jedi",
        "Star Wars: \"Empire Strikes Back\""
      ]
    }
    

    注意下一个在titles 中的字符串uncommon terms

    POST stars/_doc
    {
      "my_id": "MH125",
      "titles": [
        "uncommon terms",
        "Star Wars: A New Hope",
        "Star Wars: Return of the Jedi",
        "Star Wars: \"Empire Strikes Back\""
      ]
    }
    

    现在,将min_doc_count 从默认的3 减少到1

    GET stars/_search
    {
      "size": 0,
      "aggs": {
        "titles": {
          "terms": {
            "field": "my_id"
          },
          "aggs": {
            "my_common_terms": {
              "significant_terms": {
                "field": "titles",
                "min_doc_count": 1
              }
            }
          }
        }
      }
    }
    

    屈服

      "aggregations" : {
        "titles" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [
            {
              "key" : "MH123",
              "doc_count" : 1,
              "my_common_terms" : {
                "doc_count" : 1,
                "bg_count" : 3,
                "buckets" : [ ]
              }
            },
            {
              "key" : "MH124",
              "doc_count" : 1,
              "my_common_terms" : {
                "doc_count" : 1,
                "bg_count" : 3,
                "buckets" : [ ]
              }
            },
            {
              "key" : "MH125",
              "doc_count" : 1,
              "my_common_terms" : {
                "doc_count" : 1,
                "bg_count" : 3,
                "buckets" : [
                  {
                    "key" : "uncommon terms",
                    "doc_count" : 1,
                    "score" : 2.0,
                    "bg_count" : 1
                  }
                ]
              }
            }
          ]
        }
      }
    

    还有其他方法可以对此进行调整,但这就是使用重要术语的方式。


    您正在寻找的是带状过滤器,这里有一个 good start

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 2014-07-09
      • 2016-06-22
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多