#ruby-on-rails #ruby-on-rails-3 #solr #sunspot
#ruby-on-rails #ruby-on-rails-3 #solr #sunspot
Вопрос:
В моей базе данных или индексе Solr есть следующие 2 продукта: Total War: Shogun 2 [Скачать] и Eggs.
Что я хочу, чтобы поиск мог выполнять, так это сопоставлять эти 2 продукта с ошибками, например:
"Egggs", "Eggz", "Eg", "Egs" and "Shogn Download", "Totle War","Tutal War: Shogunn 2 Download"
и т.д.
РЕДАКТИРОВАТЬ (немного работает):
Это поможет вам начать, хотя все еще возникают проблемы с использованием разных символов внутри поиска, т. Е. Только такие вещи, как «Яйца» и «Цельное молоко с витамином D» могут быть написаны с ошибкой, а не «Total War: Shogun 2».
Новый код:
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="1" splitOnNumerics="1" splitOnCaseChange="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/>
<filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="1" splitOnNumerics="1" splitOnCaseChange="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/>
<filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
В идеале мой поиск должен быть похож на Googles, где он довольно хорошо исправляет вашу орфографию, будь то в нижнем или верхнем регистре, а также с парой ошибок. Как мне сделать мой поиск похожим на то, что делает Google?
Ответ №1:
Нечеткие поиски не подвергаются анализу времени запроса.
Таким образом, есть вероятность, что ваш запрос не соответствует условиям индекса.
Термины в приведенной выше конфигурации подвергаются фильтрации в нижнем регистре во время индексации, которая сохранит все термины в нижнем регистре.
И поиск Egggs никогда не даст никаких результатов, поскольку Egggs не будут соответствовать eggs. Искомые термины должны быть явно в нижнем регистре.
Кроме того, в приведенной выше конфигурации анализ времени индекса сильно отличается от анализа времени запроса.
Обычно рекомендуется использовать аналогичные фильтры во время запроса и индексирования, чтобы индексируемые термины соответствовали искомым.
solr.PorterStemFilterFactory
может привести к совершенно другому корню для искомого термина и, возможно, никогда не совпадет с индексированными терминами.
Пересмотрите свою конфигурацию. Возможно, проверьте пример xml-схемы solr для справки.