Elasticsearch JS: есть ли способ выполнить выделение после того, как запрос был выполнен и хиты были возвращены? - PullRequest
1 голос
/ 19 апреля 2019

У меня есть поисковый пользовательский индекс Elasticsearch, документы которого возвращаются с выделенной подсветкой с помощью быстрой векторной подсветки Elasticsearch.

Документы в индексе имеют права доступа пользователя, поэтому, когда пользователь вводит поисковый запрос «Джон Доу», например, может быть возвращено более 10 000 совпадений, содержащих совпадения с «Джон Доу», но списокХиты должны быть отфильтрованы до 100 лучших документов, к которым пользователю разрешен доступ.Итак, в итоге пользователю показывается только 100 просмотров.

Проблема в том, что быстрое векторное выделение выполняется для всех возвращенных 10000 обращений, поэтому Elasticsearch выполняет дорогостоящее выделение для 9900 обращений, которые в конечном итоге отбрасываются.

Скорость поиска резко возрастает, если мыудалите выделение целиком, но нам нужно выделить это небольшое подмножество хитов.Есть ли способ выполнить выделение после того, как запрос был выполнен и хиты были возвращены?

1 Ответ

1 голос
/ 23 мая 2019

Я бы предложил использовать top_hits агрегацию в вашем поисковом запросе. При этом вы можете указать, чтобы он возвращал только 100 лучших документов с "size": 100. И по умолчанию он сортируется по баллам, поэтому вы должны получить наиболее подходящие документы.

И, чтобы выполнить выделение, добавьте highlight в агрегацию top_hits.

{
  "aggs": {
    "some-aggs": {
      "top_hits": {
        "size": 100,
        "highlight": {
          "fields": {
            "<field_to_highlight>": {}
          }
        }    
      }
    }
  }
}

Для этого вам понадобится условие проверки доступа в поисковом запросе.

Ссылка: Топ-агг ES *

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