Поведение Solr dismax - пунктуация и расщепление пробелов
У меня есть экземпляр Solr 4.7.0 с 200 000 документов в индексе (один документ на файл в файловой системе), который используется несколькими пользователями. Документы идентифицируются по ключевым словам, которые индексируются и хранятся в одном поле с именем "signature_1". Во время индекса я удаляю все типы знаков препинания, которые заменяю пробелами (благодаря ScriptUpdateProcessor), поэтому мои ключевые слова разделяются пробелами, как в индексе, так и в сохраненной части поля signature_1 (сигнатура типа поля).
<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>
Я хотел бы, чтобы такое же поведение во время запроса: если кто-то ищет
азбука
Я бы хотел, чтобы Solr выполнил следующий поиск (с оператором OR, dismax):
азбука
В общем, я просто хочу, чтобы Solr осуществлял поиск по ключевым словам документа, исключив пунктуацию.
Верхний пример работает хорошо, но в некоторых случаях он не работает таким образом. С запросом
До н.э.
Dismax разбивает запрос в
(+(DisjunctionMaxQuery((signature_1:a)) DisjunctionMaxQuery((signature_1:"b c"))) ())/no_coord
и это портит актуальность (то есть порядок) моих результатов. Я попытался использовать autoGeneratePhraseQueries="True", но безрезультатно.
Поэтому я бы хотел, чтобы Dismax всегда разделял пробелы и знаки препинания или никогда не делал этого (результаты будут одинаковыми). Любая идея, как мне удается это сделать (без необходимости создавать мой класс Java Dismax)?
Следующие посты связаны с моей проблемой:
2 ответа
Я наконец нашел решение, оно немного "быстрое и грязное", но оно работает: в Velocity я создал функцию Javascript для редактирования поля q, эта функция вызывается с использованием параметра onsubmit формы GET (это описано в /questions/24728781/izmenit-znachenie-formyi-vvoda-html-s-pomoschyu-javascript).
Но вам нужна Velocity для этого решения, если вы используете обработчик запросов без скорости (или, в более общем случае, с интерфейсом HTML), он не работает.
Я не совсем понимаю, хотите ли вы A B-C
быть запросом фразы ("A B C"
) или три отдельных запроса термина (A B C
), но:
Если вы хотите, чтобы это был запрос фразы, просто оберните все это в кавычки: "A B-C"
Если вы хотите, чтобы каждый термин находился в отдельности, просто удалите пунктуацию самостоятельно, оставив A B C
,
Парсер запросов разделяет предложения по пробелам, как правило, без знаков препинания. Это не имеет отношения к анализу, это просто синтаксис синтаксического анализатора запросов. Таким образом, для A B-C
, вы в конечном итоге с двумя предложениями запроса, A
а также B-C
, Когда анализ начинается, B-C
делится на два термина, и поэтому анализатор запросов делает его запросом фразы вместо запроса термина, и в конечном итоге результат выглядит примерно так: A "B C"