Solr с частичным поиском не работает, когда запрос заключен в кавычки, содержащие слова, разделенные пробелом - PullRequest
2 голосов
/ 11 февраля 2012

Вот мой поисковый запрос:

name_text_partial_all: "Привет, мир"

Поле содержит следующие слова в индексе для одного документа: hello world

Вот мое определение схемы для этого типа:

<fieldtype class="solr.TextField" name="text_partial_all" positionIncrementGap="100" omitNorms="false" stored="false">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.PatternReplaceFilterFactory" pattern="[^\d\sa-zA-Z]" replacement=""/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="30"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.PatternReplaceFilterFactory" pattern="[^\d\sa-zA-Z]" replacement=""/>
    <filter class="solr.LengthFilterFactory" min="2" max="30" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StandardFilterFactory"/>
  </analyzer>
</fieldtype>

Этот документ не найден. Любая подсказка, почему?

1 Ответ

1 голос
/ 12 февраля 2012

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="30"/> сгенерирует токены ngram, которые будут в отдельных позициях.
Например, Hello World, когда он проходит через NGramFilterFactory, токены Hello и World находятся в разных позициях.
Вы можете проверить анализ Hello World, токены Hello находятся в позиции 10, а world - в позиции 20.
Таким образом, запрос, ищущий точную фразу name_text_partial_all:"hello world", не будет работать, в то время как name_text_partial_all:"hello world"~9 будет работать.
Вам нужно либо использовать отстойный или позиционный фильтр, чтобы сохранить те же позиции.

...