我有一个临时索引包含我需要调整的文档。我想用它们包含的单词对这些文档进行分组。
例如,我有这些文件:
1 - “aaa bbb ccc ddd eee fff”
2 - “bbb mmm aaa fff xxx”
3 - “hhh aaa fff”
所以,我想得到最受欢迎的词,理想情况是:“aaa” - 3,“fff” - 3,“bbb” - 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",
}
}
}
}