elasticsearch - 弹性搜索交叉点查询
问题描述
我想获取按总数排序的用户列表的常用词。
示例:我有一个用户使用的单词索引。
文档:
[
{
user_id: 1,
word: 'food',
count: 2
},
{
user_id: 1,
word: 'thor',
count: 1
},
{
user_id: 1,
word: 'beer',
count: 7
},
{
user_id: 2,
word: 'summer',
count: 12
},
{
user_id: 2,
word: 'thor',
count: 4
},
{
user_id: 1,
word: 'beer',
count: 2
},
..otheruserdetails..
]
输入:user_ids: [1, 2]
所需的输出:
[
{
'word': 'beer',
'total_count': 9
},
{
'word': 'thor',
'total_count': 5
}
]
到目前为止我所拥有的:
user_id
使用user_id 列表获取所有文档(bool 应该查询)- 在应用层处理文档。
- 遍历每个关键字
- 检查每个 user_id 是否存在关键字
- 如果是,请查找计数
- 否则,处理并转到下一个关键字
- 遍历每个关键字
但是,这是不可行的,因为 word 文档会变得庞大,而应用层将跟不上。有什么方法可以将其移至 ES 查询?
解决方案
可以将“术语聚合”视为“分组依据”。输出将给出一个唯一的 userId 列表、用户下所有单词的列表以及每个单词的最终计数
{
"from": 0,
"size": 10,
"query": {
"terms": {
"user_id": [
"1",
"2"
]
}
},
"aggs": {
"users": {
"terms": {
"field": "user_id",
"size": 10
},
"aggs": {
"words": {
"terms": {
"field": "word.keyword",
"size": 10
},
"aggs": {
"word_count": {
"value_count": {
"field": "word.keyword"
}
}
}
}
}
}
}
}
结果
"hits" : [
{
"_index" : "index89",
"_type" : "_doc",
"_id" : "gFRzr3ABAWOsYG7t2tpt",
"_score" : 1.0,
"_source" : {
"user_id" : 1,
"word" : "thor",
"count" : 1
}
},
{
"_index" : "index89",
"_type" : "_doc",
"_id" : "flRzr3ABAWOsYG7t0dqI",
"_score" : 1.0,
"_source" : {
"user_id" : 1,
"word" : "food",
"count" : 2
}
},
{
"_index" : "index89",
"_type" : "_doc",
"_id" : "f1Rzr3ABAWOsYG7t19ps",
"_score" : 1.0,
"_source" : {
"user_id" : 2,
"word" : "thor",
"count" : 4
}
},
{
"_index" : "index89",
"_type" : "_doc",
"_id" : "gVRzr3ABAWOsYG7t8NrR",
"_score" : 1.0,
"_source" : {
"user_id" : 1,
"word" : "food",
"count" : 2
}
},
{
"_index" : "index89",
"_type" : "_doc",
"_id" : "glRzr3ABAWOsYG7t-Npj",
"_score" : 1.0,
"_source" : {
"user_id" : 1,
"word" : "thor",
"count" : 1
}
},
{
"_index" : "index89",
"_type" : "_doc",
"_id" : "g1Rzr3ABAWOsYG7t_9po",
"_score" : 1.0,
"_source" : {
"user_id" : 2,
"word" : "thor",
"count" : 4
}
}
]
},
"aggregations" : {
"users" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 1,
"doc_count" : 4,
"words" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "food",
"doc_count" : 2,
"word_count" : {
"value" : 2
}
},
{
"key" : "thor",
"doc_count" : 2,
"word_count" : {
"value" : 2
}
}
]
}
},
{
"key" : 2,
"doc_count" : 2,
"words" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "thor",
"doc_count" : 2,
"word_count" : {
"value" : 2
}
}
]
}
}
]
}
}
推荐阅读
- sql - 带有 INSERT 的 Oracle SQL 事务
- angular - 当我单击不同组件的按钮时,在不同组件的角度显示模式中?
- python - keras 序列模型中的多个输出
- elementor - 连接到 elementor 小部件?
- python - 如何在 Python 中将 [{'id':1'}] 之类的字符串转换为列表 [{'id':1'}] 数据类型?
- python - 如何在python中以数学形式更改$$中的字体
- c++11 - 可以使用数组中的单个元素生成的指定长度的数字
- android - Android WebRtc 为拨出电话播放拨号声音
- asp.net-mvc - 客户端必需的错误消息未显示
- bash - 跟踪 bash 函数时类似 Java 的退出