2014-09-22 2 views
0

У меня есть экземпляр 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)?

Следующие посты связаны с моей проблемой:

ответ

0

Наконец-то я нашел решение, это немного «быстрый и грязный», но он работает: в Velocity я создал функцию Javascript для редактирования поля q, эта функция вызывается с использованием параметра onsubmit формы GET (это описано в stackoverflow.com/questions/5763055/edit-value-of-a-html-input-form-by-javascript).

Но вам нужна скорость для этого решения, если вы используете обработчик запроса без скорости (или, скорее, HTML-интерфейс), он не работает.

0

Я не совсем ясно, нужно ли 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"

+0

Спасибо за ваш ответ. Я не хочу, чтобы B-C был фразовым запросом, я хочу три отдельных запроса на семантику. Я отредактировал свой комментарий, чтобы отразить тот факт, что я не единственный пользователь, поэтому ваше решение не работает для меня, я не хочу просить пользователя удалить примечания в своих запросах (также потому, что какой-то запрос будет построен с копированием/прошлое вещей, содержащих конъюнктуры). –

+0

Я думал больше о том, что у меня есть логика для нормализации текста поиска, а не для обучения пользователя. – femtoRgon

+0

Какая логика? Я использую шаблон скорости, запрос идет непосредственно из текстовой области элемента формы на веб-странице в DisjunctionMaxQuery of Solr (исправьте меня, если я ошибаюсь). Где бы я реализовал такую ​​логику? –

Смежные вопросы