Я использую Solr 7.5, чтобы сделать некоторые предложения с "/ Suggester" по категориям. Это используется для функции автозаполнения с интеграцией Solr.
Проиндексированные объекты:
- "Крыша"
- "Панели крыши"
- "Сэндвич-панели"
Ожидаемое поведение
Поиск: "roo" -> Результат: "Roof" & "Roof Panels"
Поиск "панель" -> Результат: "Панели крыши" и "Панели сэндвичей"
Проблемы
Я пробовал несколько решений с разными токенизаторами, но безуспешно.
StandardTokenizer возвращает отдельные слова
KeywordTokenizer возвращает мне полную фразу, но там у меня проблема, если я ищу «панель» -> нет предложенных слов. Ожидаются "сэндвич-панели" и "панели крыши"
ShingleFilterFactory выдает мне странные результаты, если я ищу «панель крыши» -> она возвращает «панели крыши» / «панели крыши» / «сэндвич-панели крыши»
Последняя конфигурация
Документ Solr:
"autosuggest_en":["Roof Panels",
"Sandwich Panels",
"Roof Panels",
"Sandwich Panels"],
"spellcheck_en":["Roof Panels",
"Sandwich Panels",
"Roof Panels",
"Sandwich Panels"],
solrconfig.xml
<searchComponent name="suggest" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">text_spell</str>
<lst name="spellchecker">
<str name="name">default</str>
<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
<str name="lookupImpl">AnalyzingInfixLookupFactory</str>
<str name="suggestAnalyzerFieldType">text_spell</str>
<str name="field">autosuggest</str>
<str name="buildOnCommit">true</str>
<str name="buildOnOptimize">true</str>
<str name="accuracy">0.35</str>
</lst>
</searchComponent>
schema.xml
<fieldType name="text_spell" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="10"
outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=" " fillerToken="_"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="10"
outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=" " fillerToken="_"/>
</analyzer>
</fieldType>
Приведенное выше решение дает мне следующее поведение.
поиск: "крыша" -> результаты: "крыша" & "панели крыши" = хорошо
поиск: "панель крыши" -> результаты: "панели крыши" и "панели крыши" = не хорошо. Не знаю, почему это дважды повторяет «крышу»
Какой-нибудь совет относительно правильного решения ожидаемого поведения?
Спасибо!
С уважением