Вы можете сделать общее объединение вручную - выполнить два поиска, получить все результаты (вместо верхней N), отсортировать их по ключу объединения и пересечь два упорядоченных списка.Но это очень сильно сокрушит вашу кучу (, если списки даже вписываются в нее).
Возможны оптимизации, но в очень специфических условиях.
Т.е. - вы делаете самостоятельно-присоединиться и использовать только (произвольный доступ) Filters
для фильтрации, нет Queries
.Затем вы можете вручную итерировать термины в двух полях соединения (параллельно), пересекать списки docId для каждого термина, фильтровать их - и вот ваше соединение.
Существует подход, который обрабатывает популярный сценарий использования простых родительских элементов.дочерние отношения с относительно небольшим числом дочерних элементов в документе - https://issues.apache.org/jira/browse/LUCENE-2454
В отличие от метода уплощения, упомянутого @ntziolis, этот подход корректно обрабатывает такие случаи, как: иметь несколько резюме, каждое с несколькими дочерними элементами work_experience, и попытаться найти кого-токоторый работал в компании NNN в год YYY.Если просто сгладить, вы получите резюме для людей, которые работали на NNN в любой год и работали где-то год YYY.
Альтернативой для обработки простых случаев родитель-потомок, действительно, является выравнивание документа, но убедитесь, что значения для разных дочерних элементов разделены большим пробелом posIncrement, а затем используйте запрос SpanNear
, чтобы предотвратить несколько ваших подзапросовсоответствие между детьми.Об этом было несколько лет назад в LinkedIn, но я не смог ее найти.