文档中的列表中的文档计数作为Elasticsearch

时间:2018-05-16 22:24:58

标签: elasticsearch elasticsearch-aggregation

情况:

我是Elasticsearch的初学者,无法解决如何使用聚合的问题。得到我需要的东西。

我有以下结构的文件:

{
    ...
    "authors" : [
      {
        "name" : "Bob",
        "@type" : "Person"
      }
    ],
    "resort": "Politics",
    ...
}

我想使用聚合来获取每个作者的文档数。由于某些文件的作者可能不止一个,因此应该为每个作者单独计算这些文件。

我尝试过的事情:

由于terms聚合与resort字段一起使用,我尝试将其与authorsname字段一起使用,但始终没有任何存储桶。为此,我使用了以下curl请求:

curl -X POST 'localhost:9200/news/_doc/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "_source": false,
  "aggs": {
    "author_agg": { "terms": {"field": "authors.keyword" } }
  }
}'

我总结说,terms聚合不适用于列表中包含的字段。

接下来我考虑了nested聚合,但文档说,它是

  

单桶聚合

所以不是我要找的东西。因为我用完了想法,但我得到了错误

"type" : "aggregation_execution_exception",
"reason" : "[nested] nested path [authors] is not nested"

我找到this answer并尝试将其用于我的数据。我有以下要求:

curl -X GET "localhost:9200/news/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "size": 0,
  "aggs": {
    "nest": {
      "nested": {
        "path": "authors"
      },
      "aggs": {
        "authorname": {
          "terms" : {
            "field": "name.keyword"
          }
        }
      }
    }
  }
}'

给了我错误

"type" : "aggregation_execution_exception",
"reason" : "[nested] nested path [authors] is not nested"

我搜索了如何使用映射嵌套我的路径,但我无法找到如何实现这一目标。我甚至都不知道,这是否真的有意义。

那么如何根据一个键将文档聚合到存储桶中,这个键位于文档中列表的元素中?

也许这个问题已经在其他地方得到了回答,但是我无法以正确的方式陈述我的问题,因为我仍然对所有新信息感到困惑。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我终于解决了我的问题:

获取authors键映射nested的想法是完全正确的。但遗憾的是,Elasticsearch不允许您直接将类型从非nested更改为nested,因为此键中的所有项目也必须编入索引。所以你必须采取以下方式:

  1. 使用自定义映射创建新索引。在这里,我们进入文档类型_doc,进入它的属性,然后进入文档字段authors。我们将type设置为nested
  2. curl -X PUT "localhost:9200/new_index?pretty" -H 'Content-Type: application/json' -d'
    {
      "mappings": {
        "_doc" : {
          "properties" : {
            "authors": { "type": "nested" }
          }
        }
      }
    }'
    
    1. 然后我们重新索引数据集并将目标设置为新创建的索引。这会将旧索引中的数据索引到新索引中,实质上是复制纯数据,但是采用新映射(因为设置和映射不会以这种方式复制)。
    2. curl -X POST "localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
      {
        "source": {
          "index": "old_index"
        },
        "dest": {
          "index": "new_index"
        }
      }'
      

      现在我们可以在这里进行nested聚合,根据作者将文档分类到存储桶中:

      curl -X GET 'localhost:9200/new_index/_doc/_search?pretty' -H 'Content-Type: application/json' -d'
      {
        "size": 0,
        "aggs": {
          "authors": {
            "nested": {
              "path": "authors"
            },
            "aggs": {
              "authors_by_name": {
                "terms": { "field": "authors.name.keyword" }
              }
            }
          }
        }
      }'
      

      到目前为止,我还不知道如何重命名索引,但是你肯定可以简单地删除旧索引,然后执行所描述的过程来创建另一个新索引,其名称是旧索引,但是自定义映射。