Сортировка и фильтрация упругого поиска лучших хитов документов - PullRequest
0 голосов
/ 15 марта 2019

Допустим, у меня есть простой индекс товаров для таких документов:

{
   "product_name": "some_product",
   "category": "some_cotegory",
   "price": "200"
   "sold_times": "5",
   "store": "store1"
}

, и я хочу получить самые дорогие товары в своей категории и в магазине, которые были проданы менее чем в 3 раза, и яхотите, чтобы их заказывали по магазинам, категориям и цене.

Я могу использовать агрегацию по двум терминам и агрегацию по наиболее популярным товарам, чтобы получить самые дорогие продукты в своей категории для каждого магазина, но как отсортировать и отфильтровать результаты по наиболее популярным продуктам?Мне действительно нужно отфильтровать результаты после того, как будет проведена агитация по наибольшим попаданиям, поэтому запрос фильтра не является решением.Как я могу это сделать?Thx

РЕДАКТИРОВАТЬ:

Короче говоря - мне нужен эластичный эквивалент для SQL:

SELECT p.* 
FROM products AS p
INNER JOIN (
    SELECT max(price) AS price, categroy, store 
    FROM products
    GROUP BY category, store
) AS max_prices ON p.price = max_prices.price AND p.category = max_prices.category AND p.store = max_prices.store
WHERE p.sold_times < 3;

Ответы [ 2 ]

0 голосов
/ 23 марта 2019

Ну, после некоторого поиска я нашел «возможное» решение. Я мог бы использовать агрегирование Bucket Selector вместе с некоторым сценарием, который сделал бы доступными свойства самых популярных совпадений для фильтрации, и аналогичным подходом для сортировки с использованием агрегации Bucket Sort (некоторую информацию можно найти здесь: Как отфильтровать результат агрегации метрики top_hits [ Elasticsearch] )

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

Печально, что нет простого способа сделать такой общий аналитический запрос в упругом.

0 голосов
/ 22 марта 2019

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

{
  "size": 0,
  "query": {
    "range": {
      "sold_times": {
        "lt": 3
      }
    }
  },
  "aggs": {
    "store": {
      "terms": {
        "field": "store",
        "size": 10
      },
      "aggs": {
        "category": {
          "terms": {
            "field": "category",
            "size": 10
          },
          "aggs": {
            "most_expensive": {
              "top_hits": {
                "size": 1,
                "sort": [
                  {
                    "price": {
                      "order": "desc"
                    }
                  }
                ]
              }
            }
          }
        }
      }
    }
  }
}

...