Я хочу иметь возможность выполнять следующие типы запросов:
Данные для индексации состоят из (допустим) музыкальных клипов, в которых интересно только название. Я просто хочу проиндексировать их, а затем создать для них запросы, чтобы, какое бы слово или слова ни использовал пользователь в запросе, документы, содержащие эти слова, в этом порядке в начале плитки будут возвращены первыми, а затем (в без определенного порядка) по документам, содержащим хотя бы одно из искомых слов в любой позиции заголовка. Также все это должно быть нечувствительным к регистру.
Пример:
Для документов:
- Video1Title = Море синее
- Video2Title = Дикое море
- Video3Title = Дикое море
- Video4Title = Все, что угодно на берегу моря
Если я ищу "море", я хочу получить
- "Video1Title = Море синее"
сначала следуют все остальные документы, содержащие слово «море» в названии, но не в начале.
Если я ищу "Дикое море", я хочу получить
- Video2Title = Дикое море
- Video3Title = Дикое море
сначала следуют все другие документы, в названии которых есть «Дикое» или «Море», но нет префикса «Дикое море».
Если я ищу «Seasi», я ничего не хочу получать (мне все равно на токенизацию ключевых слов и префиксные запросы).
Теперь, AFAIKS, нет реального способа сказать Lucene «найди мне документы, в которых слово1, слово2 и т. д. находятся на позициях 1, 2, 3 и т. д.».
Существуют «обходные пути» для имитации такого поведения:
Проиндексируйте поле дважды. В
field1
у вас есть токенизированные слова (возможно, с использованиемStandardAnalyzer
), а вfield2
все они собраны в один элемент (с использованиемKeywordAnalyzer
). Затем, если вы ищете что-то вроде:+(поле1:слово1 слово2 слово3) (поле2:"слово1 слово2 слово3*")
эффективно сообщая Lucene: «Документы должны содержать слово1, слово2 или слово3 в заголовке, и, кроме того, те, которые соответствуют «заголовок начинается с >слова1 слово2 слово3‹», лучше (получают более высокий балл).
- Добавьте «lucene_start_token» в начало поля при их индексации, чтобы
Video2Title = Wild sea
индексировалось как «title:lucene_start_token Wild sea
» и так далее для остальных.
Затем выполните запрос, чтобы:
+(название:море) (название:"lucene_start_token море")
и заставить Lucene вернуть все документы, которые содержат мое поисковое слово (слова) в заголовке, а также дать более высокий балл тем, кто соответствует «lucene_start_token + поисковые слова»
Мой вопрос в том, действительно ли существуют лучшие способы сделать это (возможно, используя PhraseQuery и Термин position)? Если нет, то что из вышеперечисленного лучше с точки зрения производительности?