我有以下JSON结构,我想在ElasticSearch中运行聚合查询:
{
"user_id": 1,
"gender_id": 1,
"locale_id": 6,
"age": 38,
"hometown_city_id": 1002,
"current_city_id": 672,
"books": [
{
"b_id": 2065,
"b_name": "aut qui assumenda ut",
"b_cat": 56
},
{
"b_id": 2527,
"b_name": "libero et laudantium",
"b_cat": 132
},
...
]
}
我基本上想要做的是例如用“gender_id”向用户显示前5本书:“1”(男性)已经读过,其中也读了“b_id”的书:2065。
作为ElasticSearch的初学者,我还没有遇到过解决方案。我知道Aggegation模块(https://github.com/elasticsearch/elasticsearch/issues/3300)随v1.0推出,但我无法运行。
如果有人已经实现了类似的东西,请帮忙!非常感谢提前!
答案 0 :(得分:1)
可能是这样的(不确定嵌套书籍。字段):
{
"query" : {
"match_all" : { }
},
"facets" : {
"filter_one" : {
"filter" : {
"and" : [
{"filter" : {"term" : { "gender_id" : 1 }},
{"filter" : {"term" : { "books.b_id" : 2065 }},
]
}
},
"book_cnt" : {
"terms" : {
"field" : "books.b_name",
"size" : 5
}
}
}
}
答案 1 :(得分:0)
感谢@mconlin提示。我得到它的查询如下:
{
"query": {
"filtered": {
"filter": {
"and" : [
{ "term": { "gender_id": 1 } },
{ "term": { "books.b_id": 2065} }
]
}
}
},
"facets": {
"book_cnt": {
"terms": {
"field": "books.b_id",
"size": 5
}
}
}
}
原来最好在查询本身中使用过滤器而不是单独的构面。