elasticsearch - 如何在Elasticsearch中查找出现的热门词语

标签 elasticsearch aggregation querydsl elastic-stack

我在Elasticsearch中有一个相当大的数据集:1个索引,一种类型的大约1.2亿条记录。我正在处理关于给定主题的大量段落。主题的数量是有限的,并且与唯一的ID相关联。每个段落都有几个由sentence_id标识的句子(在所有主题中都是唯一的)。每个句子有多个单词,每个单词可以出现多次。因此,我的mapping如下所示:

{ 
    "sentence_id": 1200,
    "topic_id": 2,
    "value": "ground",
    "occurrences": 20
}

现在,我想运行一个查询来回答这个问题:
“找到给定主题ID的最高单词,并按其出现顺序进行排序。”

因此,对于主题中的每个单词,我必须对所有句子中的单词进行sum up,对其进行sort并返回。

我无法实现这一目标。我尝试编写aggregation term query,但是它不求和出现,而只是返回每个单词的唯一记录数。
{
    "query": {
        "term": {
           "topic_id": {
              "value": 3117
           }
        }
    },
    "aggs": {
        "total_occurrences": {
            "terms": {
                "field": "occurrences",
                "size": 1000
            }
        }
    }
}

有人可以帮我吗?

最佳答案

我认为您首先需要在唯一的aggregate上添加value,然后在其sum上添加 occurrences ,假设您的occurrences字段为numeric,您的查询应类似于以下内容

{
  "query": {
    "term": {
      "topic_id": {
        "value": 3117
      }
    }
  },
  "aggs": {
    "total_occurrences": {
      "terms": {
        "field": "value",
        "size": 1000,
        "order": {
          "sum_occurrences": "desc" <--- to sort by top words
        }
      },
      "aggs": {
        "sum_occurrences": {
          "sum": {
            "field": "occurrences"
          }
        }
      }
    }
  },
  "size": 0
}

希望这可以帮助!

关于elasticsearch - 如何在Elasticsearch中查找出现的热门词语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34457251/

相关文章:

csv - Logstash解析CSV日期

elasticsearch - 多个领域的 Elasticsearch 聚合

querydsl - 如何在 QueryDSL 中对不同表进行并集

mysql - 排序和分页

elasticsearch - 使用 Logstash 计算特定日志事件的持续时间

javascript - AngularjS 到 ElasticSearch 的连接超时

python - Django 根据另一个查询注释查询集

r - R 中另一个变量的平均变量

querydsl - 如何使用动态 QueryDSL 简化语法,避免出现多个 "if"

java - Flume + ElasticSearch 接收器 TTL