Как я могу удалить дубликаты документов результатов через сегменты агрегации Elasticsearch? - PullRequest
0 голосов
/ 26 сентября 2018

Elasticsearch версия 5.2.

Я использую агрегацию top_hits в агрегации filter, чтобы получить наборы результатов в пакетах, которые соответствуют разным фильтрам, но я не хочу видеть тот же результат влюбые два сегмента, даже если он соответствует обоим наборам фильтров.Есть ли способ сделать это?Это плохая идея?

Пример запроса:

GET _search
{
"size": 0,
"aggs": {
    "block 1": {
        "filter": {
            "bool": {
                "must": [{
                        "terms": {
                            "property1": [
                                "value1",
                                "value2"
                            ]
                        }
                    }
                ]
            }
        },
        "aggs": {
            "block 1_hits": {
                "top_hits": {
                    "size": 10
                }
            }
        }
    },
    "block 2": {
        "filter": {},
        "aggs": {
            "block 2_hits": {
                "top_hits": {
                    "size": 10
                }
            }
        }
    }
}
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

k, учитывая комментарии к вопросу, я собираюсь предложить ответ, который не совсем то, что вы искали, но, кажется, было бы неплохо сделать в этой ситуации.

Так как мы 'здесь речь идет только о 10 запросах на запрос, я предлагаю сделать несколько запросов эластичными, но с одной оговоркой: не делайте их последовательно, это будет не идеально с точки зрения производительности.На самом деле, не пытайтесь вообще исключать какие-либо идентификаторы в серии запросов!

Делайте эти запросы асинхронно, но запрашивайте все большие и большие размеры страниц для каждого запроса.10, 20, 30, 40 и т. Д. Затем в коде удалите элементы из блока 1 в блоке 2 и так далее.Таким образом, если «Блок 2» имеет 100% -ное перекрытие с блоком 1, тогда вы можете удалить эти 10 элементов и при этом иметь требуемый размер страницы 10 для блока 2.

Редактировать: Для комментария @ dotybear: Нетнужно делать несколько запросов, просто увеличивайте размер страницы в каждом последующем запросе (при условии, что ранние «блоки» получают приоритет для дубликатов)

0 голосов
/ 26 сентября 2018

Одним из решений может быть создание отрицательного запроса (первого) для вашей второй агрегации.Итак, если в вашем запросе есть обязательный термин, добавьте must_not для тех же терминов во втором запросе.Это может не работать для всех случаев использования, но я думаю, что это должно быть хорошо для вышеупомянутого запроса.

...