Подходит ли BlockJoinQuery в Lucene для поиска документов с фрагментами (родительско-дочерние отношения) - PullRequest
2 голосов
/ 12 октября 2011

Я использую 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 голос
/ 13 октября 2011

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

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

Вариант 3 можно заставить работать, хотя это немного сложно, потому что вам придется использовать AND на уровне родительского документа. Т.е. создайте BooleanQuery с двумя предложениями MUST. Первое предложение это BlockJoinQuery (TermQuery (Term ("tags", "sunny"))), а второе предложение - BlockJoinQuery (TermQuery (Term ("text", "sleepy"))) Это должно работать, я думаю? Вы просто не можете выполнить AND на уровне поддокумента (фрагмента), так как ни у одного фрагмента нет обоих терминов.

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