Elasticsearch - 如何获取流行的单词文档列表

ole*_*leg 11 elasticsearch

我有一个临时索引包含我需要缓和的文档.我想用它们包含的单词对这些文档进行分组.

例如,我有这些文件:

1 - "aaa bbb ccc ddd eee fff"

2 - "bbb mmm aaa fff xxx"

3 - "hhh aaa fff"

所以,我想得到最受欢迎的词,理想情况是:"aaa" - 3,"fff" - 3,"bbb" - 2等.

弹性搜索有可能吗?

Oll*_*ank 14

进行简单的术语聚合搜索将满足您的需求:

(mydata你的领域名称在哪里)

curl -XGET 'http://localhost:9200/test/data/_search?search_type=count&pretty' -d '{
  "query": {
    "match_all" : {}
  },
  "aggs" : {
      "mydata_agg" : {
    "terms": {"field" : "mydata"}
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

将返回:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "mydata_agg" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ {
        "key" : "aaa",
        "doc_count" : 3
      }, {
        "key" : "fff",
        "doc_count" : 3
      }, {
        "key" : "bbb",
        "doc_count" : 2
      }, {
        "key" : "ccc",
        "doc_count" : 1
      }, {
        "key" : "ddd",
        "doc_count" : 1
      }, {
        "key" : "eee",
        "doc_count" : 1
      }, {
        "key" : "hhh",
        "doc_count" : 1
      }, {
        "key" : "mmm",
        "doc_count" : 1
      }, {
        "key" : "xxx",
        "doc_count" : 1
      } ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 9

可能是因为这个问题和公认的答案已经有些年头了,但现在有更好的方法。

接受的答案没有考虑到最常见的词通常是无趣的这一事实,例如“the”、“a”、“in”、“for”等停用词。

这通常适用于包含 typetext而非数据的字段keyword

这就是为什么 ElasticSearch 实际上有一个专门用于此目的的聚合,称为“重要文本聚合”
从文档:

  • 它专门设计用于类型text字段
  • 它不需要字段数据或文档值
  • 它即时重新分析文本内容,这意味着它还可以过滤嘈杂文本的重复部分,否则这些部分往往会扭曲统计数据。

但是,它可能比其他类型的查询花费更长的时间,因此建议在使用 query.match 或先前的采样器类型聚合过滤数据后使用它

因此,在您的情况下,您将发送这样的查询(省略过滤/采样):

{
    "aggs": {
        "keywords": {
            "significant_text": {
                "field": "myfield"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于许多用例来说,这可能是一个完美的解决方案,但请记住,它与带有停用词过滤器的术语聚合不同。“重要的单词是在前景和背景集之间测量的流行度发生显着变化的单词。”这意味着您最终可能会在列表中得到被认为是“重要”但不一定是最“常见”的单词,即使在考虑了停用词。它们在前景中比在背景中更常见。 (2认同)