Подходит ли BlockJoinQuery в Lucene для поиска документов с фрагментами (родительско-дочерняя связь)

#search #lucene

#Поиск #lucene

Вопрос:

Я использую Lucene для индексации документов, состоящих из фрагментов. Документ в целом состоит из полей, описывающих его (т. Е. автор, название, дата публикации). Фрагменты содержат текст и теги (ключевые слова). Я хотел бы иметь возможность:

  1. поиск всех фрагментов по автору, у которых есть тег Foo.
  2. поиск всех документов по названию.
  3. поиск всех документов, которые содержат некоторые слова (в любом фрагменте)

Я читал о BlockJoinQuery в Lucene, но я не уверен, подходит ли это для моей проблемы: например, наличие следующего документа:

 document: title="Hello World" author="Sam Brown"
fragment 1: tags="sunny" text="...."
fragment 2: tags="cloudy" text="moody and sleepy"
  

смогу ли я найти этот документ с помощью запроса:
tags:sunny and text:sleepy ?
Такой запрос не будет соответствовать ни одному дочернему документу (фрагменту), но, возможно, он будет соответствовать родительскому — в документации lucene это не указано.

Ответ №1:

Случай 1 должен хорошо работать с BlockJoinQuery.

Случай 2 работает хорошо, без BlockJoinQuery.

Можно заставить работать случай 3, хотя это немного сложно, потому что вам придется И на уровне родительского документа. Т. Е. Создайте BooleanQuery с двумя обязательными предложениями. Первое предложение — BlockJoinQuery(TermQuery(Term(«теги», «солнечный»))), а второе предложение — BlockJoinQuery(TermQuery(Term(«текст», «сонный»))). Я думаю, это должно сработать? Вы просто не можете выполнить обработку на уровне вложенного документа (фрагмента), поскольку ни один фрагмент не содержит обоих терминов.