У меня есть экземпляр Solr 4.7.0 с 200 000 документов в индексе (один документ на файл в файловой системе), используемый несколькими пользователями. Документы идентифицируются по ключевым словам, которые индексируются и сохраняются в одном поле под названием «signature_1». Во время индекса я удаляю все знаки пунктуации, которые меня заменяют пробелом (благодаря ScriptUpdateProcessor), поэтому мои ключевые слова разделены пробелами, как в индексе, так и в хранимой части поля signature_1 (подпись типа поля).Solr dismax behavior - пунктуация и разделение пробелов
<fieldType name="signature" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9éèàùêâûôîäëöüï])" replacement=" "/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="1000" consumeAllTokens="false"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<!--<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang\stopwords_fr.txt" enablePositionIncrements="true" />-->
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_chantiers.txt" ignoreCase="true" expand="false"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_chantiers_secteurs.txt" ignoreCase="true" expand="false"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="French" />
</analyzer>
<analyzer type="query">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9éèàùêâûôîäëöüï])" replacement=" "/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<!--<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang\stopwords_fr.txt" enablePositionIncrements="true" />-->
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_chantiers.txt" ignoreCase="true" expand="false"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="French" />
</analyzer>
</fieldType>
Я хотел бы такое же поведение во время запроса: если кто-то поиск
ABC
Я хотел бы Solr сделать следующий запрос (с оператором ИЛИ, dismax):
ABC
Так что, в основном, я просто хочу, чтобы Solr выполнял поиск между ключевыми словами документа, пунктуация удалялась.
Верхний пример работает хорошо, но в некоторых случаях он работает не так. При запросе
A BC
Dismax разбивает запрос в
(+ (DisjunctionMaxQuery ((signature_1: а)) DisjunctionMaxQuery ((signature_1: "БК")))())/no_coord
и это испортило релевантность (то есть порядок) моих результатов. Я попытался использовать autoGeneratePhraseQueries = «True», но без эффекта.
Поэтому я бы хотел, чтобы Dismax всегда разбивался на пробелы и пунктуацию или никогда не делал этого (результаты будут одинаковыми). Любая идея, как я могу это сделать (без создания моего класса Java Dismax)?
Следующие посты связаны с моей проблемой:
- SOLR generates phrase queries on punctuation
- Solr Dismax handler - whitespace and special character behaviour
Спасибо за ваш ответ. Я не хочу, чтобы B-C был фразовым запросом, я хочу три отдельных запроса на семантику. Я отредактировал свой комментарий, чтобы отразить тот факт, что я не единственный пользователь, поэтому ваше решение не работает для меня, я не хочу просить пользователя удалить примечания в своих запросах (также потому, что какой-то запрос будет построен с копированием/прошлое вещей, содержащих конъюнктуры). –
Я думал больше о том, что у меня есть логика для нормализации текста поиска, а не для обучения пользователя. – femtoRgon
Какая логика? Я использую шаблон скорости, запрос идет непосредственно из текстовой области элемента формы на веб-странице в DisjunctionMaxQuery of Solr (исправьте меня, если я ошибаюсь). Где бы я реализовал такую логику? –