#search #lucene
#Поиск #lucene
Вопрос:
Я использую Lucene для индексации документов, состоящих из фрагментов. Документ в целом состоит из полей, описывающих его (т. Е. автор, название, дата публикации). Фрагменты содержат текст и теги (ключевые слова). Я хотел бы иметь возможность:
- поиск всех фрагментов по автору, у которых есть тег Foo.
- поиск всех документов по названию.
- поиск всех документов, которые содержат некоторые слова (в любом фрагменте)
Я читал о 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(«текст», «сонный»))). Я думаю, это должно сработать? Вы просто не можете выполнить обработку на уровне вложенного документа (фрагмента), поскольку ни один фрагмент не содержит обоих терминов.