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

时间:2015-01-02 11:49:00

标签: elasticsearch

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

例如,我有这些文件:

1 - “aaa bbb ccc ddd eee fff”

2 - “bbb mmm aaa fff xxx”

3 - “hhh aaa fff”

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

弹性搜索有可能吗?

2 个答案:

答案 0 :(得分:14)

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

(其中mydata是您字段的名称)

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

将返回:

{
  "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
      } ]
    }
  }
}

答案 1 :(得分:0)

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

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

对于包含text类型而不是keyword类型数据的字段,通常是这种情况。

这就是为什么ElasticSearch实际上具有专门用于此目的的聚合称为Significant Text Aggregation
从文档中:

  • 它是专为在类型text字段上使用而设计的
  • 它不需要字段数据或文档值
  • 它可以即时重新分析文本内容,这意味着它还可以过滤嘈杂文本的重复部分,否则这些部分可能会使统计数据偏斜。

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

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

{
    "aggs": {
        "keywords": {
            "significant_text": {
                "field": "myfield",
            }
        }
    }
}