Как найти «FooBar» при поиске «Foo Bar» в Zend Lucene - PullRequest
4 голосов
/ 29 апреля 2009

Я создаю функцию поиска для php-сайта, используя Zend Lucene, и у меня возникла проблема. Мой сайт - директор магазина (что-то в этом роде).

Например, у меня есть магазин с именем "FooBar", но мои посетители ищут "Foo Bar" и получают нулевые результаты. Также, если магазин называется «Foo Bar» и посетитель ищет «FooBar», ничего не найдено.

Я пытался найти "foobar ~" (нечеткий поиск), но не нашел статей с именем "Foo Bar"

Есть ли особый способ построения индекса или выполнения запроса?

Ответы [ 4 ]

2 голосов
/ 29 апреля 2009

Вариант 1: разбить строку входного запроса на две части в разных точках и найти их. например. В этом случае запрос будет (+ fo + bar) ИЛИ (+ foo + bar) ИЛИ (+ foob + ar) Проблема в том, что этот токенизация предполагает наличие двух токенов во входной строке запроса. Кроме того, вы можете получить дополнительные, возможно, не относящиеся к делу результаты, такие как (+ foob + ar)

Вариант 2. Использование индексации в n-граммах при индексации и запросах. При индексировании токенов для «foo bar» будет fo, oo, ba, ar. При поиске с помощью foobar токенами будут fo, oo, ob, ba, ar. Поиск с оператором OR в качестве оператора даст вам документы с максимальным n-граммовым соответствием вверху. Это можно сделать с помощью NGramTokenizer

1 голос
/ 07 мая 2009

Вручную добавить индексные записи для наиболее распространенных путаницы в именах. Заставьте своих клиентов печатать их в специальной форме.

0 голосов
/ 01 мая 2009

Если вам не важна производительность, используйте WildcardQuery (производительность значительно ниже):

new WildcardQuery( new Term( "propertyName", "Foo?Bar" ) );

Для нуля или более символов используйте '*', для нуля или одного символа используйте '?'

Если важна производительность, попробуйте использовать BooleanQuery.

0 голосов
/ 29 апреля 2009

Вы пробовали "* foo * AND * bar *" или "* foo * ИЛИ * bar *"? Это работает в Ferret, и я читал, что это основано на Lucene.

...