Вернуть вложенный объект, соответствующий полю copy_to вasticsearch - PullRequest
0 голосов
/ 03 марта 2020

Вот структура моего индекса. Событие имеет много вложенных объектов: документов, сайтов и персон.

Некоторые поля некоторых вложенных объектов копируются в root.

Events
|--- persons—names
|--- other fields
|
|———— Documents
          --------- other fields
|
|———— Sites
          ---------- other fields
|
|———— Persons
           -----------name (copied to the root)
           ------------- id

Теперь предположим, что я делаю поиск по строке запроса.

Если документ возвращается, ПОТОМУ ЧТО он соответствует именам лиц, я хочу вернуть только inner_hit ассоциированного объекта, который в этом случае является «персоной». Обратите внимание, что в документе может быть несколько человек, и мне нужно вернуть именно тот, который соответствует, поэтому это может быть проблемой, потому что copy_to - это массив, который не указывает на связанный с ним вложенный объект.

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

Таким образом, я смогу создать поиск по нескольким объектам -> Что я под этим подразумевается, что я верну либо событие, документ, сайт или человека, в зависимости от того, что соответствует запросу.

Как я могу это сделать? Не стесняйтесь перенаправить меня к другому подходу, чтобы решить мою проблему поиска нескольких объектов.

1 Ответ

0 голосов
/ 03 марта 2020

Использование Объясните API может быть хорошим подходом, как обсуждено здесь: https://discuss.elastic.co/t/best-way-to-return-which-field-matched/4140/3

Таким образом, решение будет:

  • Сделайте запрос query_string
  • для каждого результата:
    • Используйте API объяснения для них (используя их идентификаторы)
    • Анализируйте результаты API объяснения и попытайтесь найти если результат совпадает из-за поля человека, сайта или документа.
    • возвращает только соответствующий вложенный объект.

Хотя это кажется действительно сложным.

Другой вариант - добавить новый документ в мой индекс для каждого вложенного объекта. Это будет выглядеть так:

Events
|
|--- other fields
|
|———— Documents
|         --------- other fields
|
|———— Sites
|          ---------- other fields
|
|———— Persons
           -----------name (NOT copied to the root)
           ------------- id

### And on the same index, you have other documents for each nested objects

Persons
-----------name (NOT copied to the root)
------------- id
Sites
---------- other fields

Documents
--------- other fields

Тогда строка query_string будет прямой.

Последняя альтернатива - использовать индекс для каждого типа этих объектов и запрашивать все эти индексы одновременно .

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