Поведение 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"

Другие вопросы по тегам