Как обрабатывать фасетную фильтрацию и соответствующие показатели агрегации? - PullRequest
0 голосов
/ 27 марта 2019

Добрый день всем. Вопрос касается граненого поиска.

Предположим, есть 2 фильтра:

2,1 категории Грузоперевозки (1765) Автомобили (1566) Любой другой (8675)

2,2 цвета Красный (5689) Зеленый (156) Синий (3599) Желтый (2562)

Как мы видим перед каждым фильтром, указано, сколько элементов по отдельности хранится в эластичном элементе. Поставьте галочку напротив «груза».

Поведение сейчас:

2,1 категории Грузоперевозки (1765) Автомобили (0) Больше (0)

2,2 цвета Красный (красный номер груза) Зеленый (номер зеленого груза) Синий (номер синего груза) Желтый (номер желтого груза)

Вам нужно это поведение:

2,1 категории Грузоперевозки (1765) Автомобили (1566) Любой другой (8675)

2,2 цвета Красный (красный номер груза) Зеленый (номер зеленого груза) Синий (номер синего груза) Желтый (номер желтого груза)

То есть фильтр определенного поля не влияет на его агрегацию, но влияет на все остальные. Как это можно реализовать оптимизировано? Теперь реализовано для x запросов на эластичность, а x равно количеству фильтров

С наилучшими пожеланиями

1 Ответ

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

Если исходный запрос равен match_all, запрос для

2.1 Категории Грузовые (1765) Автомобили (1566) Любые другие (8675)

2,2 Цвета Красный (5689) Зеленый (156) Синий (3599) Желтый (2562)

будет:

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "CATEGORIES": {
      "terms": {
        "field": "category"
      }
    },
    "COLORS": {
      "terms": {
        "field": "color"
      }
    }
  }
}

Когда выбран Freight, то, что ожидается, объясняется шаг за шагом, как показано ниже:

1. Фильтровать записи

Это может быть достигнуто с помощью запроса условий в поле category. Теперь, если этот запрос применяется перед агрегацией, это приводит к проблеме, упомянутой в вопросе. Фасет CATEGORIES будет иметь счет против Frieght, а остальные значения будут равны нулю. Хотя фасет COLORS будет иметь ожидаемые значения. Для решения этой проблемы мы можем использовать post_filter . Это обеспечит фильтрацию записей после подготовки агрегатов.

Вот как это будет работать:

Шаг 1: match_all (исходный запрос)

Шаг 2: подготовка агрегатов

Шаг 3: применить фильтр (ожидаемый результат поиска)

С помощью вышеизложенного мы добьемся правильных отфильтрованных результатов и ожидаемого числа CATEGORIES фасета, но число в COLORS все еще остается тем же, что и ожидалось уменьшить в соответствии с выбором в CATEGORIES фасете. Следующий шаг исправляет это.

2. Количество других граней, которые должны быть изменены соответственно

Чтобы справиться с этим, мы будем использовать агрегацию фильтров вместе с фактической агрегацией. Мы будем применять post_filter в каждой из оставшихся агрегаций, где должны выполняться подсчеты, т. Е. Все агрегации, кроме CATEGORIES, который в нашем случае составляет всего COLORS.

Сочетая два вышеупомянутых шага, запрос будет:

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "CATEGORIES": {
      "terms": {
        "field": "category"
      }
    },
    "COLORS": {
      "filter": {
        "terms": {
          "category": [
            "Freight"
          ]
        },
        "aggs": {
          "COLORS": {
            "terms": {
              "field": "color"
            }
          }
        }
      }
    },
    "post_filter": {
      "terms": {
        "category": [
          "Freight"
        ]
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...