ElasticSearch:统计一组文档中一组单词的出现频率 [英] ElasticSearch: Count Frequency of Occurrence of a Set of Words in a Set of Documents
本文介绍了ElasticSearch:统计一组文档中一组单词的出现频率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下ElasticSearch查询:
{
"from": 0,
"sort": [
"_score"
],
"fields": [
"id",
"title",
"text"
],
"query": {
"query_string": {
"fields": [
"title",
"text"
],
"query": "("green socks" OR "red socks") AND NOT ("yellow" OR "blue")"
}
},
"size": 100
}
这可以很好地工作,并返回一组大约包含80,000个文档的文档。
我想对这80,000个文档集(即匹配"query": "("green socks" OR "red socks") AND NOT ("yellow" OR "blue")")
的文档集)计算以下公式:
- 每双"绿色袜子"计算编号。在80,000个文档中至少包含一次"绿色袜子"。
- 对于每一只"红袜子",计算编号。在80,000个文档中至少包含一次"红袜子"。
- 以此类推,对于位于上述查询字符串左侧的所有其他单词/短语。
- 每个查询字符串中实际上大约有50-100个这样的单词/短语,所以我实际运行的查询字符串中又有50-100个这样的"红袜子"单词/短语。
这感觉像是聚合查询,但我就是看不到它。
感谢收到的任何帮助
谢谢,
R
推荐答案
您猜对了。这是聚合的工作。但是,如果您的映射不正确,聚合可能会很慢。例如,如果对可能包含大量标记的已分析字段(如"Text")进行聚合,则会导致较高的内存使用率,进而影响性能。
现在到了您的要求,您想要在80000个结果集中包含"red sock"的文档的计数。您希望术语出现在任何位置(表示在标题或文本字段中)或仅出现在特定字段中。如果希望它位于任何字段中,则需要首先将这些字段合并到单个字段中。您可以在查询中使用简单的terms aggregation,它将提供该字段中所有术语的计数。
{
.................
"query": {
"query_string": {
"fields": [
"title",
"text"
],
"query": "("green socks" OR "red socks") AND NOT ("yellow" OR "blue")"
}
},
"aggs" : {
"my-terms" : {
"terms" : {
"field" : "title"
}
}
}
"size": 100
}
如果您只想计算某些术语集,如"红袜子"、"绿袜子"等,则应使用filters aggregation
{
.................
"query": {
"query_string": {
"fields": [
"title",
"text"
],
"query": "("green socks" OR "red socks") AND NOT ("yellow" OR "blue")"
}
},
"aggs" : {
"my-terms" : {
"filters" : {
"filters" : {
"red socks" : { "term" : { "title" : "red sock" }},
"green sock" : { "term" : { "title" : "green sock" }},
......
and so on...
}
}
}
"size": 100
}
需要注意的是,如前所述,字段映射将影响聚合的性能和内存要求。
这篇关于ElasticSearch:统计一组文档中一组单词的出现频率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文