Точный поиск по фразе не работает из-за параметра slop запроса = 0 по умолчанию.При поиске фразы «Hello World» он ищет термины с последовательными позициями.Мне бы хотелось, чтобы в EdgeNGramFilter был параметр для управления выходным позиционированием, это похоже на старый вопрос .
Установив для параметра qs очень высокое значение (больше максимального расстояния между нграммами), вы можете получить фразы обратно.Это частично решает проблему, позволяющую найти фразы, но не точные перестановки.Таким образом, поиск "contrat informatique" будет соответствовать тексту типа "... контракт отменен. Informatique ..."
Для поддержки точного запроса фразыВ итоге я использую отдельные поля для нграмм .
Необходимые шаги:
Определить отдельные типы полей для индексации обычных значений и граммов:
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="ngrams" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Скажите solr копировать поля при индексации:
Вы можете определить отдельное отражение ngrams для каждого поля:
<field name="contact_ngrams" type="ngrams" indexed="true" stored="false"/>
<field name="product_ngrams" type="ngrams" indexed="true" stored="false"/>
<copyField source="contact_text" dest="contact_ngrams"/>
<copyField source="product_text" dest="product_ngrams"/>
Или вы можете поставитьвсе нграммы в одном поле:
<field name="heap_ngrams" type="ngrams" indexed="true" stored="false"/>
<copyField source="*_text" dest="heap_ngrams"/>
Обратите внимание, что в этом случае вы не сможете разделить бустеры.
И последнее - указать поля и бустеры нграмм в запросе.,Одним из способов является настройка вашего приложения.Другой способ - указать параметры «добавления» в файле solrconfig.xml
<lst name="appends">
<str name="qf">heap_ngrams</str>
</lst>