PHP Zend Lucene делает поиск «нечувствительным к акценту», как и «нечувствительным к регистру» - PullRequest
2 голосов
/ 06 марта 2012

Итак, я создаю поисковую систему для сайта, используя Zend_Search_Lucene

В настоящее время я использую Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive, который отлично работает, за исключением одной вещи: он делает различия между акцентированными и не акцентированными символами

В google (и других поисковых системах) при поиске «χιονι» будут возвращаться результаты для всех его вариантов, например «χιόνι», что является правильной версией с ударением на греческом языке (χιόνι = snow btw). В lucene (в общем, не только Zend_Search_Lucene) это не стандартное или даже связанное поведение из того, что я видел

Моя первая попытка найти решение было сделать то, что делает lucene для поиска без учета регистра - анализаторы, удалять акценты с букв так же, как анализаторы без учета регистра просто делают все строчными при индексации и поиске (то есть $ str = strtr ($ ул, 'ό', 'о'))

Единственная причина, по которой это не удалось, заключается в том, что php не имеет mb_strtr и strtr не работает для многобайтовых символов, подобных этому, и preg_replace просто не работает либо

Есть ли способ сделать поиск lucene в "нечувствительном к акценту" режиме (вероятно, анализатором) или альтернативный способ неакцентировать многобайтовые символы в php (я также выполнил поиск по этому вопросу без результатов)?

Имейте в виду, что я хочу искать не западноевропейские акцентированные символы, для которых есть несколько неприличных решений для php в сети

1 Ответ

1 голос
/ 07 марта 2012

Вы пробовали normalizer_normalize, чтобы удалить диакритические знаки из текста: Как удалить диакритические знаки из текста?

Вы также можете использовать $str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str);

Затем вы можете создать токен-фильтр (расширяя Zend_Search_Lucene_Analysis_TokenFilter) для нормализации ваших ключевых слов.

Я не знаю, работает ли это для вашей кодировки.

...