Текст подсказки Solr, содержащий —

#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» в качестве поискового запроса, а этот словарь другого термина (соответствующий другому полю) его не содержит.