情况:
我是Elasticsearch的初学者,无法解决如何使用聚合的问题。得到我需要的东西。
我有以下结构的文件:
{
...
"authors" : [
{
"name" : "Bob",
"@type" : "Person"
}
],
"resort": "Politics",
...
}
我想使用聚合来获取每个作者的文档数。由于某些文件的作者可能不止一个,因此应该为每个作者单独计算这些文件。
我尝试过的事情:
由于terms
聚合与resort
字段一起使用,我尝试将其与authors
或name
字段一起使用,但始终没有任何存储桶。为此,我使用了以下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"
我搜索了如何使用映射嵌套我的路径,但我无法找到如何实现这一目标。我甚至都不知道,这是否真的有意义。
那么如何根据一个键将文档聚合到存储桶中,这个键位于文档中列表的元素中?
也许这个问题已经在其他地方得到了回答,但是我无法以正确的方式陈述我的问题,因为我仍然对所有新信息感到困惑。感谢您的帮助。
答案 0 :(得分:0)
我终于解决了我的问题:
获取authors
键映射nested
的想法是完全正确的。但遗憾的是,Elasticsearch不允许您直接将类型从非nested
更改为nested
,因为此键中的所有项目也必须编入索引。所以你必须采取以下方式:
_doc
,进入它的属性,然后进入文档字段authors
。我们将type
设置为nested
。〜
curl -X PUT "localhost:9200/new_index?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"_doc" : {
"properties" : {
"authors": { "type": "nested" }
}
}
}
}'
〜
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" }
}
}
}
}
}'
到目前为止,我还不知道如何重命名索引,但是你肯定可以简单地删除旧索引,然后执行所描述的过程来创建另一个新索引,其名称是旧索引,但是自定义映射。