ОК, я нашел быстрый и простой способ решения проблемы.
У fieldType есть необязательный атрибут autoGeneratePhraseQueries (по умолчанию = true). Если я установил для autoGeneratePhraseQueries значение false, все будет нормально.
Пояснение:
fieldType, используемый в schema.xml:
<fieldType name="edgytext" class="solr.TextField" autoGeneratePhraseQueries="false">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhiteSpaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
</analyzer>
</fieldType>
Если вы индексируете слово «сюрприз», в индексе есть следующие токены:
с, су, сюр, сюрп, сюрприз, сюрприз, сюрприз, сюрприз
Если вы ищете "surpriese" (с орфографической ошибкой), solr создает следующие токены (соответствующие токены выделены жирным шрифтом):
с , су , сюр , сюрп , сюрприз , сюрпри, сюрприз, сюрприз, сюрприз
Реальный запрос, который будет создан, выглядит так:
mySearchField: s, mySearchField: su, mySearchField: sup .. и т. Д.
Но если вы установите autoGeneratePhraseQueries = true, будет создан следующий запрос:
mySearchField: "s su surp supr сюрприз сюрприз сюрприз"
Это запрос фразы, который не соответствует индексированным терминам.