ElasticSearch搜索,获取退回产品的唯一类别

时间:2018-10-19 13:43:10

标签: elasticsearch elasticsearch-2.0

在拥有数千种产品的eshop中,顶部有一个搜索栏。搜索的预期输出是一个类别列表,其中有与查询匹配的产品。

例如,搜索“ iphone”应返回存在带有该关键字的产品的类别列表。 例如 -手机 -手机电池 -手机套 -等等

我所做的是在产品索引中搜索关键字,然后得到结果,选择每个产品的category_id,删除重复项,并在类别索引中使用应该显示的ID进行/ _mget。

但是,这似乎是无效的,因为第一次搜索可能会返回1万个结果(如果过于笼统),然后我循环遍历以获取其category_id。

我正在寻找实现上述目标的更好方法。

关于如何使上述内容更有效率的任何想法?

1 个答案:

答案 0 :(得分:0)

看一下Elasticsearch Aggregationshttps://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html

一个不错的起点是Terms Aggregation,它是bucket聚合https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html

一个例子:

GET /_search
{
    "query": {...},
    "aggs" : {
        "categories" : {
            "terms" : { "field" : "category_name" }
        }
    }
}

响应应该看起来像这样,它将字段值和计数放入buckets中。

{
    ...
    "aggregations" : {
        "categories" : {
            "doc_count_error_upper_bound": 0, 
            "sum_other_doc_count": 0, 
            "buckets" : [ 
                {
                    "key" : "Mobile phones",
                    "doc_count" : 6
                },
                {
                    "key" : "Batteries for phones",
                    "doc_count" : 3
                },
                {
                    "key" : "Cases for phones",
                    "doc_count" : 2
                }
            ]
        }
    }
}