Поиск ElasticSearch, получить уникальные категории возвращаемых продуктов - PullRequest
0 голосов
/ 19 октября 2018

В интернет-магазине с тысячами товаров у нас есть панель поиска вверху.Ожидаемый результат поиска - это список категорий, в которых есть товары, соответствующие запросу.

Например, при поиске «iphone» должен быть возвращен список категорий, в которых есть товары с этим ключевым словом.напр. - мобильные телефоны - аккумуляторы для телефонов - чехол для телефонов - и т. д.

Я выполнил поиск по индексу продуктов по ключевому слову, затем получил результаты, извлекли category_id каждого продукта, удалил дубликаты и сделалa / _mget в индексе категорий с идентификаторами, которые я должен отобразить.

Это, однако, кажется неэффективным, так как первый поиск может вернуть результаты в 10 000 (если он слишком общий), которые я затем перебираю, чтобы получить его category_id.

Я ищу более эффективные способы выполнения вышесказанного.

Любые идеи о том, как сделать вышеизложенное более эффективным?

1 Ответ

0 голосов
/ 19 октября 2018

Загляните в Elasticsearch Aggregations.https://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
                }
            ]
        }
    }
}
...