2009-10-08 5 views
1

У меня есть индекс Lucene, который заполняется из базы данных. Я храню/индексирую некоторые поля, а затем добавляю поле FullText, в котором я индексирую содержимое всех остальных полей, поэтому я могу выполнить общий поиск.Lucene - Поиск нескольких терминов в разных полях

Теперь, скажем, у меня есть документ со следующими двумя полями: FLD1 - «Samsung выпускает новый 22-дюймовый ЖК-экран» fld2 - «батареи Sony Ericsson телефона взрываются»

Если пользователь делает «Samsung phone», он, вероятно, просто хочет получать новости о телефонах samsung, а не документ с информацией о экране samsung и телефоне sony, но при поиске в поле FullText я получу это как действительный результат. Есть ли хороший способ справиться с этим?

Я думал индексации с некоторым сепаратором и делает SpanNotQuery, поэтому FullText поле будет иметь это содержание: «Samsung релизы батареи новый 22-дюймовый ЖК-экран MYLUCENESEPARATOR Sony Ericsson телефона взорваться», а затем делает SpanNotQuery с MYLUCENESEPARATOR как нераспространяющийся термин.

Это хорошее решение? Имеет ли он масштаб с более чем двумя терминами? Я боюсь, что это будет убийца производительности. Есть ли лучший способ достичь этого?

ответ

2

Если количество полей ограничено, вы можете поместить две строки описания в два разных поля. Затем вы можете использовать MultiFieldQueryParser для поиска по этим полям. Поскольку это два отдельных поля, документ будет соответствовать только в том случае, если оба условия появятся в одном поле с оператором AND.

Давайте рассмотрим ваш пример. FLD1 - "Samsung выпускает новый 22-дюймовый ЖК-экран" fld2 - "батареи Sony Ericsson телефона взрываются"

Если они индексируются в отдельных областях FLD1 & fld2, ваш запрос становится

(+fld1:samsung +fld1:phone) (+fld2:samsung +fld2:phone) 

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

+0

Я принял ваш ответ, но забыл проголосовать. Возможно, немного поздно, но просто сделал это сейчас :-) – raven

+0

Спасибо, Хайме. –

Смежные вопросы