Apache Solr поиск части слова

Я использую поисковую систему Apache Solr для индексации базы данных моего сайта.

Я использую django + http://haystacksearch.org/

Допустим, у меня есть документ со словом "Цыпленок"

Когда я ищу "курица" - Solr может найти этот документ

Но когда я ищу "цыпочку" - она ​​ничего не находит..

Есть ли способ это исправить?

5 ответов

Решение

Примечание: следующее решение относится только к Solr 1.4 (и выше)!

Для большей гибкости я бы порекомендовал индексировать ваши данные с помощью NGramTokenizerFactory, чтобы выполнять поиск по шаблонам с лицевой и обратной стороны. Если вы просто хотите найти подстроки в начале или конце строки, рассмотрите возможность использования EdgeNGramTokenizerFactory.

Вот капля в замене типа текстового поля, которое бы соответствовало вашим потребностям:

<fieldType name="text" class="solr.TextField" >
<analyzer type="index">
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
    <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

Если вы хотите найти все слова, начинающиеся с chick, найдите chick*.

Когда я использовал

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />

для поиска по шаблону из ответа Брайана время индексации Solr резко увеличилось. Более чем в 20 раз! Другое решение проблемы поиска по шаблону, которое я нашел здесь:

http://www.lucidimagination.com/blog/2009/09/08/auto-suggest-from-popular-queries-using-edgengrams/

Вам нужно просто добавить фильтр

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />

(токенайзер по умолчанию - solr.WhitespaceTokenizerFactory в индексном блоке FieldType). Для меня результат был таким же с меньшими системными затратами.

Другой подход, если у вас возникли проблемы с небольшим набором слов, будет использовать solr.SynonymFilterFactory

http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

Вам просто нужно сохранить простой текстовый файл, который содержит синонимы:

chick peep chicken
dawg hound dog
moggie puss kitten cat

Множественные числа должны заботиться о себе с другими фильтрами.

Я не изменил ни одной конфигурации. Я просто использую звездочку спереди и сзади моего searchString: *chicke * (без пробела в конце -> это из-за SO форматирования слова как курсива, если вы используете * в начале и в конце)

Другие вопросы по тегам