2010-08-23 2 views
6

Я начинаю с новичком с Solr и имею проблему с нежелательными символами, попадающими в результаты запроса. Например, когда я ищу «foo bar», я получил контент с «foo» bar и т. Д. Я просто хочу иметь точные соответствия. Насколько я знаю, это можно настроить в файле schema.xml. Мой тип содержимого поля:Solr query/полевой анализатор

<fieldtype name="textNoStem" class="solr.TextField" positionIncrementGap="100"> 
<analyzer type="index"> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
</analyzer> 
<analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldtype> 

Пожалуйста, дайте мне знать, если вы знаете решение. С уважением.

+0

Чтобы уточнить, «foo bar» не должен соответствовать «foo» bar, потому что foo окружен одинарными кавычками, а «foo bar» не должен соответствовать «foo», потому что отсутствует «bar». Это то, что вы имели ввиду? –

ответ

13

Для обоих анализаторов первая строка должна быть токенизатором. Токенизатор используется для разделения текста на более мелкие единицы (слова, большую часть времени). Для вашей потребности, возможно, правильный выбор. WhitespaceTokenizerFactory.

Если вы хотите абсолютное точное совпадение, вам не нужен фильтр после токенизатора. Но если вы не хотите, чтобы поиски были чувствительны к регистру, вам нужно добавить LowerCaseFilterFactory.

Обратите внимание, что у вас есть два анализатора: один из типов «индекс» и другой тип «запрос». Поскольку имена подразумеваются, первый используется при индексировании содержимого, а другой используется, когда вы выполняете запросы. Правило, которое почти всегда хорошо, состоит в том, чтобы иметь одинаковый набор токенизаторов/фильтров для обоих анализаторов.

+0

спасибо, это очень помогло! – Daniel

+0

Я бы предложил использовать PatternReplaceCharFilterFactory для удаления одиночных символов кавычек перед токенизацией. –

+0

Возможно, лучше, если анализатор запросов имеет дополнительный фильтр синонимов в дополнение ко всему анализу индекса содержимого? – WoLfPwNeR

0

Если вы просто хотите, чтобы точное совпадение использовало KeywordTokenizerFactory вместо StandardTokenizerFactory во время запроса.

+0

Благодарим за быстрый ответ. Однако при использовании KeywordTokenizerFactory я вообще не получаю никаких результатов с запросами типа «foo bar». Я попробовал добавить для запроса анализатора, но все равно никаких изменений. У меня заканчиваются идеи. – Daniel

0

Я думаю, вы не получите никаких результатов, потому что tokening выполняется по-разному на данных, которые уже проиндексированы. Как сказал Паскаль, whitespaceTokenizer - правильный выбор в вашем случае. Используйте его как по индексу, так и по времени запроса и проверяйте результаты после индексации некоторых данных, а не на ранее проиндексированных данных.

Я предлагаю использовать страницу анализа, чтобы увидеть результаты с фактической индексацией. Очень полезно. Внесите изменения в схему, обновите ядро, перейдите на страницу анализа и посмотрите на подробный вывод, чтобы получить пошаговый анализ.