ElasticSearch聚合查询可能吗?

时间:2013-12-17 17:03:14

标签: elasticsearch aggregation

我有以下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推出,但我无法运行。

如果有人已经实现了类似的东西,请帮忙!非常感谢提前!

2 个答案:

答案 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
            }
        }
    }
}

原来最好在查询本身中使用过滤器而不是单独的构面。