Apache Solr поисковая проблема
У меня проблема с поиском в apachesolr.
Например, содержимое, которое я проиндексировал:
- Тирамису д'ивер
- Velouté d'hiver
- Minestrone d'hiver crémeux,
- Смузи версия Hiver
когда я ищу "Hiver", я получаю только Hiver версии Smoothie в качестве результатов.
Когда я ищу Dhiver, я получаю как результаты
- Тирамису д'ивер
- Velouté d'hiver
- Минестроне д'ивер крем
Мне нужно получить все результаты, ищу ли я hiver или dhiver или dhiver
У кого-нибудь есть идея, в чем проблема? Должен ли я что-то изменить в моем schema.xml?
Моя схема для текстового поля:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="1"
catenateAll="0"
splitOnCaseChange="1"
splitOnNumerics="1"
preserveOriginal="1"
/>
<filter class="solr.LengthFilterFactory" min="3" max="100" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="5"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="0"
catenateAll="0"
splitOnCaseChange="1"
splitOnNumerics="1"
/>
<filter class="solr.LengthFilterFactory" min="3" max="100" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="multiterm">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
/>
<filter class="solr.WordDelimiterFilterFactory"
protected="protwords.txt"
generateWordParts="1"
generateNumberParts="1"
catenateWords="0"
catenateNumbers="0"
catenateAll="0"
splitOnCaseChange="1"
preserveOriginal="1"/>
<filter class="solr.LengthFilterFactory" min="2" max="100" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
1 ответ
Ммм вкусно.
Во-первых, для решения всех подобных проблем используйте инструмент Solr Analysis - ваш друг. Во-вторых, помните, что Solr совпадает только в том случае, если запрос и термины на 100% состоят из одинаковых символов.
Для следующего фильтра
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
Velouté d'hiver будет проанализирован как
велют | д'ивер | д | Дайвер | пчеловод
Так что будет соответствовать вашему запросу для Hiver - вы можете удалить | д | маркер, который сгенерировал мой фильтр.
Не забудьте сложить символы акцента тоже где-нибудь.