У меня есть приложение Rails+Sunspot, и я работаю над его настройкой, чтобы поиск возвращал единственную версию запроса. Например:
Я хочу, чтобы поиск "cookie" возвращал что-то с именем "cookie". В настоящее время мой поиск Sunspot возвращает «cookie», но не «cookie» (единственное число).
Я внес некоторые изменения в файл Solr schema.xml, добавив solr.EdgeNGramFilterFactory для обеспечения большей гибкости, но EdgeNGramFilterFactory не подходит для этого случая, так как он допускает совпадения только тогда, когда запрос является подстрокой имени результата. Насколько я понимаю, EdgeNGramFilterFactory будет возвращать «cookie», когда пользователь ищет «co», «coo», «cook» или «cooki», но не суперстроку «cookie» (то есть: cookies). Проще говоря, это связано с тем, что «cookies» не является подстрокой внутри «cookie».
Я пытался добавить все три встроенных фабрики Solr, но безрезультатно. Вы можете увидеть один закомментированный в моей схеме.
В schema.xml соответствующее поле выглядит следующим образом:
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
<!-- <filter class="solr.EnglishMinimalStemFilterFactory"/> -->
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Я предполагал, что смогу сингуляризировать запрос пользователя, но я бы предпочел не трогать его запрос до того, как он попадет в Solr.
Вы можете поиграть с этим здесь: http://staging.zisboombah.com/parent/food_guide/?search=cookie. Попробуйте изменить запрос между «cookie» и «cookies».
Буду очень признателен за любые советы о том, как это сделать в Solr!