Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Вы пробовали «*foo* AND *bar*» или «*foo* OR *bar*»?Он работает в Ferret, и я читал, что он основан на Lucene.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top