Я делаю функцию автозаполнения Solr. В основном я намеревался предложить все возможные комбинации тегов из текстовой строки. Давайте рассмотрим пример строки поиска: найти все маршруты между Марсом и Юпитером .
Предположим, существует несколько документов solr, начинающихся с текста mars и Юпитер , например Марс1 , Марс2 , Юпитер8 . Я хотел получить предложения Solr, такие как
найти весь маршрут между mars1 и jupiter8
найти всемаршрут между mars2 и jupiter8
Также следует выполнить поиск частично введенного термина. Таким образом, следующий поисковый запрос также должен работать.
найти весь маршрут между Марсом и Джупи
Поисковые предложения:
найти всемаршрут между mars1 и jupiter8
найти все маршруты между mars2 и jupiter8
В этом случае использования, так как мне нужно было пометить строку поиска соответствующими объектами. я использую solrTextTagger .
Моя цепочка анализатора выглядит следующим образом
<fieldType name="searchtag" class="solr.TextField" positionIncrementGap="100" postingsFormat="Memory"
omitTermFreqAndPositions="true" omitNorms="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory" />
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.PorterStemFilterFactory"/>
<filter class="org.opensextant.solrtexttagger.ConcatenateFilterFactory" />
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="50" minGramSize="2"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory" />
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
, она работает для solr 5.3.1. Но после Solr Solr 7,4 SolrTextTagger добавляется в Solr по умолчанию. С добавленным solrTextTagger я не могу достичь того же результата, что и выше.
Я пробовал это для solr 7.7.1.
<fieldType name="searchtag" class="solr.TextField" postingsFormat="FST50" omitTermFreqAndPositions="true" omitNorms="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" expand="false"/>
<filter class="solr.EnglishPossessiveFilterFactory" />
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.FlattenGraphFilterFactory"/>
<filter class="solr.ConcatenateGraphFilterFactory" preserveSep="false" preservePositionIncrements="false"/>
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="50" minGramSize="2"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory" />
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
Выше не сработало. Я нашел причину в справочном руководстве Solr. Как указано ниже
Поле тега, которое должно быть TextField
, с ConcatenateGraphFilterFactory
в конце цепочки индексов (не цепочкой запросов): Установите preservePositionIncrements=false
в этом фильтре,Рекомендуемые настройки поля: omitNorms=true
, omitTermFreqAndPositions=true
и postingsFormat=FST50
.
Я перепробовал все возможные варианты расположения фильтров solr. Не удалось достичь того же результата, который я получал с помощью solr 5.3.1, поэтому я застрял с solr 5.3.1.
Есть ли способ использовать solrTextTagger с граничным n-граммовым фильтром принижняя часть цепи фильтра?