Как работает фасетный поиск в Elasticsearch?

Как можно сформулировать запрос на агрегацию для фасетного поиска в интернет-магазине, учитывая предоставленный мапинг для создания индекса?
  • 26 мая 2024 г. 17:31
Ответы на вопрос 2
Фасетный поиск в Elasticsearch позволяет агрегировать данные на основе заданных критериев для получения суммарной информации о документах, например, о количестве уникальных значений поля или общей статистике по значениям поля.

Для формулирования запроса на агрегацию для фасетного поиска в интернет-магазине, учитывая предоставленный маппинг (mapping) для создания индекса в Elasticsearch, необходимо знать структуру данных и их поля.

Пример маппинга для создания индекса в Elasticsearch:

```json
{
  "mappings": {
    "properties": {
      "product_name": {
        "type": "text"
      },
      "category": {
        "type": "keyword"
      },
      "price": {
        "type": "float"
      },
      "brand": {
        "type": "keyword"
      }
    }
  }
}
```

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

```json
{
  "aggs": {
    "unique_categories": {
      "terms": {
        "field": "category.keyword"
      }
    }
  }
}
```

В данном запросе мы использовали аггрегацию по терминам (terms aggregation), где указали поле "category.keyword" для подсчета уникальных значений категорий товаров. Полученный результат будет содержать информацию о количестве уникальных категорий и количестве товаров в каждой категории.

Таким образом, формулируя запросы на агрегацию с учетом маппинга индекса Elasticsearch, можно получать различные сводные данные для фасетного поиска в интернет-магазине.
Кажется нащупал: 
Первый вариант
GET /_search
{
 "size" : 0,
 "aggs": {
    "size": {
           "aggs": {
              "price": {
                   "terms": { "field": "price","size" : 100 }
               },
              "sex": {
                   "terms": { "field": "sex","size" : 100 }
               },
              "category": {
                   "terms": { "field": "category","size" : 100 }
               },
              "color": {
                   "terms": { "field": "color","size" : 100 }
               },
               "brand": {
                   "terms": { "field": "brand","size" : 100 }
               }
           },
           "filter": {
             "bool" : {
               "filter" : [
               {
                 "terms": { "size": ["10US"] }
               }
               ]
             }
           }
    },
        "color": {
           "aggs": {
              "size": {
                   "terms": { "field": "size","size" : 100 }
               }
           },
           "filter": {
             "bool" : {
               "filter" : [
               ]
             }
           }
    }
 }
}


Второй вариант
GET /_search
{
 "size" : 0,
 "aggs": {
    "size": {
           "aggs": {
              "price": {
                   "terms": { "field": "price","size" : 100 }
               },
              "sex": {
                   "terms": { "field": "sex","size" : 100 }
               },
              "category": {
                   "terms": { "field": "category","size" : 100 }
               },
              "color": {
                   "terms": { "field": "color","size" : 100 }
               },
               "brand": {
                   "terms": { "field": "brand","size" : 100 }
               }
           },
           "filter": {
             "bool" : {
               "filter" : [
               {
                 "terms": { "size": ["10US"] }
               }
               ]
             }
           }
    },
        "color": {
           "aggs": {
              "size": {
                   "terms": { "field": "size","size" : 100 }
               }
           },
           "filter": {
             "bool" : {
               "filter" : [
               {
                 "terms": { "color": ["Красный"] }
               }
               ]
             }
           }
    }
 }
}
Похожие вопросы