Есть ли способ выполнить своего рода запрос «перекрестного соединения» для нескольких динамических полей?

#elasticsearch

Вопрос:

Мы пытаемся разработать новый метод для запроса, возможно, сотен тысяч уникальных комбинаций «терминов» для данного документа. В настоящее время мы генерируем все комбинации терминов в PHP и храним их все в одном поле, которое мы можем запросить. Мне любопытно, есть ли способ сделать все это во время выполнения с помощью Elasticsearch. Я думаю, что это лучше всего объяснить с помощью примера документа и запроса:

Конкретный объект в нашей системе может иметь 1 или более упорядоченных групп из 1 или более терминов:

 {
     group1: [a, b],
     group2: [c, d],
     ...
     groupX: [y, z]
}
 

Сегодня мы создаем уникальные комбинации групповых терминов (по 1 термину из каждой группы) и храним эти комбинации в виде массива строк в одном поле:

 ["acy", "bcy", ... ]
 

Это позволяет нам запрашивать наш документ по этому уникальному коду, например, «a-c-y» можно проанализировать, чтобы удалить специальные символы и вернуть совпадение. Проблема, однако, в том, что создание этих комбинаций невероятно неэффективно и требует больших затрат памяти, и мы ищем более эффективный способ хранения этой информации.

Предлагает ли Elasticsearch что-нибудь, что позволило бы нам просто хранить отдельные группы (например, в динамических полях) и создавать комбинации на лету при запросе?