Один из способов реализовать автозаполнение, подобное Google, — объединить черепицу и компонент термвектора в Solr 1.4.
Сначала мы генерируем все распределения n-грамм с компонентом черепицы, а затем используем термвектор, чтобы получить прогноз, наиболее близкий к последовательности терминов пользователя (на основе частоты документов).
Схема:
<fieldType name="shingle_text_fivegram" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
<filter class="solr.ShingleFilterFactory" maxShingleSize="5" outputUnigrams="false"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
Solr config:
<searchcomponent name="termsComponent" class="org.apache.solr.handler.component.TermsComponent"/>
<requesthandler name="/terms" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<bool name="terms">true</bool>
<str name="terms.fl">shingleContent_fivegram</str>
</lst>
<arr name="components">
<str>termsComponent</str>
</arr>
</requesthandler>
С приведенной выше настройкой мне нужно отбросить стоп-слова в любом месте на краях n-грамм и сохранить их внутри последовательности n-грамм.
Скажем, из последовательности «индия и китай» мне нужна следующая последовательность:
india
china
india and china
и пропустите остальные.
Возможно ли это в сочетании с другими компонентами/фильтрами Solr?
UPD: вот одно из возможных решений в Lucene 4 (должна быть возможность подключиться к SOLR):
«Не могли бы вы создать настраиваемый стоп-фильтр, который удалял бы стоп-слова только в начале (первые видимые токены) или в конце ввода (после них не было видно токенов, не являющихся стоп-словами)? Это потребовало некоторой буферизации/сохранения состояния. (захват/восстановление состояния), но это кажется выполнимым?" -- Майкл МакКэндлесс
из: http://blog.mikemccandless.com/2013/08/suggeststopfilter-carefully-removes.html