#solr #autocomplete
#solr #автозаполнение
Вопрос:
Я использую Apache Solr Suggesterдля автозаполнения. При поиске с помощью ‘DC’ я получаю ответ DC-UK_ITP вместе с другими значениями.
Когда я ищу DC-UK_ITP, он не может найти значение и не возвращает никаких предложений.
Как я должен передать значение DC-UK_ITP, чтобы он мог правильно найти значение?
Или есть какие-либо настройки, которые мне нужно выполнить при настройке Solr.
Комментарии:
1. проверьте используемые анализаторы .. они должны удалять — добавлено в DC-UK … Если бы вы могли поделиться используемым типом поля .. это было бы полезно
Ответ №1:
При настройке компонента «suggester» всегда важно следить за параметром «suggestAnalyzerFieldType» из solrconfig.xml
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">mySuggester</str>
...
<str name="suggestAnalyzerFieldType">suggest_type</str>
...
</lst>
</searchComponent>
Значения, которые были созданы во время «индексации» (когда suggester создавал свои структуры данных), должны соответствовать значениям, которые будут получены во время «запроса» (по сути, когда вы будете выполнять запрос).
Учитывая, что у вас есть следующие настройки в schema.xml:
<field name="suggest_field" type="suggest_type" indexed="true" stored="true" multiValued="true"/>
<fieldType name="suggest_type" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
Документ с
"suggest_field": ["DC-UK_ITP"]
будет сохранен в индексах со следующими терминами: dc, uk_itp.
Для того, чтобы использовать подсказку на основе «содержит», я бы рекомендовал рассмотреть поиск AnalyzingInfixLookupFactory следующим образом:
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">infixSuggester</str>
<str name="lookupImpl">AnalyzingInfixLookupFactory</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">suggest_field</str>
<str name="weightField">price</str>
<str name="suggestAnalyzerFieldType">suggest_type</str>
<str name="buildOnStartup">false</str>
</lst>
</searchComponent>
Анализ поиска по инфиксу также выделит вас в ответе, что очень удобно, если вы используете его непосредственно из пользовательского интерфейса окна поиска. Стратегия сопоставления позволит вам сопоставлять по любому префиксу, так что вы сможете сопоставить исходное значение «DC-UK_ITP» либо по:
- amp;suggest.dictionary=infixSuggesteramp;suggest.q= dc
- amp;suggest.dictionary=infixSuggesteramp;suggest.q=uk
- amp;suggest.dictionary=infixSuggesteramp;suggest.q=dc-uk_itp
Полезные ресурсы по теме:
Комментарии:
1. Пожалуйста, найдите ниже записи solrconfig и schema: —
2. <Имя поискового компонента=»suggestMapName» class=»solr. SuggestComponent»> <lst name=»suggester»> <str name=»name»>suggestMapName</str> <str name=»lookupImpl»>AnalyzingInfixLookupFactory</str> ………………… < имя str= «поле»>mapName_partial</str> <имя str=»payloadField»> Имякарты</str> <имя str=»suggestAnalyzerFieldType»>имя_карты</str> <имя str=»queryAnalyzerFieldType»>имя_карты>mapName_text_suggest</str> …………………. </ lst> </SearchComponent>
3. Насколько я понимаю, solrconfig.xml имеет аналогичную настройку, как вы упомянули.
4. Я внесу предложенные вами изменения и попробую
5. прошло много времени, но была ли у вас возможность попробовать? 🙂
Ответ №2:
«Suggester» просто извлекает токены, начинающиеся с символов «DC», из словаря токенов, соответствующего индексированному полю, в этом случае он извлекает токен «DC-UK_ITP». Затем вы делаете запрос к другому полю, проиндексированному по-другому, и используете «DC-UK_ITP» в качестве поискового запроса, а этот словарь другого термина (соответствующий другому полю) его не содержит.