Elasticsearch: возвращает уникальные записи по нескольким индексам - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь вернуть уникальные записи по нескольким индексам.

Предположим, у меня есть два индекса: indexA и indexB. Мой эластичный поиск запрашивает оба тезисных индекса.

Если я фильтрую по имени поля «Тип» (это в обоих индексах), как мне получить только уникальные?

Пример: indexA имеет запись со столбцом «тип» со значением «альфа» и indexB имеет запись со столбцом «тип» со значением «альфа». Мой elasti c поисковый запрос должен выводить только одну из этих записей (не важно, какую).

Пока у меня есть это:

searchParams = {
                "body": {
                    "size": searchService.PAGE_SIZE,
                    "from": searchService.currentPage * searchService.PAGE_SIZE,
                    "query": {
                        "bool": {
                            "must": must
                        }
                    },
                    "aggs": {
                        "unique_type": {
                            "terms": {
                                "field": "type",
                                "size": 1
                            }
                        }
                    }
                }
            };

Но это не работает.

Спасибо!

1 Ответ

0 голосов
/ 23 апреля 2020

Ваш запрос просто нуждается в небольшой настройке: измените значение параметра size.

Как я могу вернуть N наиболее частых значений типа ключевого слова по нескольким индексам?

Вы можете использовать terms агрегация для этого. В агрегации terms параметр size ограничивает количество сегментов, которые вы возвращаете. В вашем случае вы установили его на 1, и эта агрегация вернет только 1 сегмент.

Установите размер на 10 или другую подходящую сумму. Это вернет N наиболее частых значений этого поля (type в вашем случае).

Кстати, все поиски Elasticsearch могут быть выполнены по нескольким индексам одновременно .

Что, если мне также понадобится пример документа для каждого сегмента?

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

Агрегирования возвращают некоторую статистику, такую ​​как AVG() и SUM(), делают в SQL, для всего набора результатов. Это отдельные номера, а не документы. В вашем случае Elasticsearch сначала ограничит набор документов теми, которые соответствуют только указанному вами запросу must, а затем вычислит все агрегации для этого набора документов.

Есть ли способ попросить Elasticsearch: go вернуться из этих результатов агрегации и получить "лучший удар" для каждого сегмента? Существует, и это называется top_hits агрегация. В вашем случае такая top_hits агрегация будет go внутри terms one.

Обе агрегации terms и top_hits имеют свои ограничения, например, они не могут вернуть все сегменты, если они слишком многие или все соответствующие документы, поскольку Elasticsearch старается быть максимально быстрым. Пожалуйста, проверьте соответствующие страницы документации.

Что если мне понадобится полный список всех уникальных значений поля?

В этом случае вы можете использовать составное агрегирование и разбивать на сегменты, как вы уже делаете нумерацию результатов поиска (с size и from).


Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...