Поиск по подстановочным знакам Solr не работает в общем текстовом поле

#solr

Вопрос:

Я новичок в мире Solr, и у меня есть Solr 7.7.2

Я пытаюсь выполнить поиск по диким картам, но он не возвращает никаких результатов. Ниже приведен мой индекс, анализатор запросов, настроенный для типа поля.

Пример текста: Стандартный анализатор запросов Solr поддерживает поиск по подстановочным знакам с одним и несколькими символами в пределах одного термина.

В приведенном выше примере текста я хотел бы выполнить поиск по стандарту*, чтобы соответствовать стандарту word. Спасибо за вашу помощь в этом.


 <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
    <analyzer type="index">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>      
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
      <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
      <filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" splitOnCaseChange="0" splitOnNumerics="0"/>
      <filter class="solr.FlattenGraphFilterFactory" />
      <filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1"/>
      <filter class="solr.FlattenGraphFilterFactory" />
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.PorterStemFilterFactory"/>
      <filter class="solr.RemoveDuplicatesTokenFilterFactory" />
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>      
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
      <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
      <filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" splitOnCaseChange="0" splitOnNumerics="0"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.PorterStemFilterFactory"/>
      <filter class="solr.RemoveDuplicatesTokenFilterFactory" />
    </analyzer>
  </fieldType> 

Снимок экрана анализа со страницы администратора

Комментарии:

1. подстановочный знак будет работать в строковом поле, а не в текстовом поле

2. Привет, Абхиджит, спасибо за твой ответ. Но простой строковый тип поля также не работает. стандартное значение поля (Индекс) и стандартное* Значение поля (запрос) не совпадают.

3. вам необходимо перезагрузить сервер после внесения изменений…

4. Я не изменил тип поля. Просто используйте экран анализа на портале администратора и попробуйте проверить, выбрав поле в качестве строки и запустив выше

5. Это зависит. Какой текст вы хотите проиндексировать и как вы хотите его сопоставить? If standard -это слово в тексте (т. е. this is standard , имеющее только белый символ и фильтр нижнего регистра, который должен позволять вам это делать field:standar* , чтобы соответствовать одному standard маркеру. Для более продвинутой обработки потребуется фильтр NGramFilter

Ответ №1:

После еще нескольких часов анализа добавил EdgeNgramfilter, и это сработало. Я предполагаю, что при использовании большого текстового поля возникнут проблемы с производительностью. Возможно, мне придется это проверить.

 <filter class="solr.EdgeNGramFilterFactory" minGramSize="5" maxGramSize="10"/> 
 <analyzer type="index">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>      
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
      <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
      <filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" splitOnCaseChange="0" splitOnNumerics="0"/>
      <filter class="solr.FlattenGraphFilterFactory" />
      <filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1"/>
      <filter class="solr.FlattenGraphFilterFactory" />
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="5" maxGramSize="10"/>
      <filter class="solr.PorterStemFilterFactory"/>
      <filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>