SOLR Нечувствительный к регистру поиск
У меня проблема в SOLR Search.
У меня есть такие данные:
![enter image description here]()
Я использую solr admin, чтобы найти эти данные, используя такой запрос:
address_s:*Nadi*
и нашел эти данные. Но когда я использую этот запрос:
address_s:*Nadi*
он ничего не нашел.
У меня есть googling, и я нашел ответ, чтобы создать поле со следующим script:
<fieldType name="c_text" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Я скопирую эти теги script в schema.xml, но он все равно не работает. Что мне делать? Кто-нибудь может мне помочь?
Ответы
Ответ 1
Поле address_s должно быть определено как -
<field name="address_s" type="c_text" indexed="true" stored="true"/>
Если вы используете файл schema.xml по умолчанию, эта защита должна появиться раньше -
<dynamicField name="*_s" type="string" indexed="true" stored="true"/>
который определяет его как тип поля строки без проведенного анализа.
Подстановочные запросы не подвергаются анализу.
Поэтому, если вы примените фильтр нижних регистров при запросе индекса времени address_s:*nadi*
, то работайте.
Тем не менее, запрос address_s:*Nadi
* не будет, поскольку Nadi
не будет соответствовать Nadi
в индексе, и вам нужно будет уменьшить регистр запросов на стороне клиента.
Ответ 2
Использует ли ваше поле address_s этот тип поля c_text
в файле schema.xml?
Если ваш индекс был создан с предыдущей конфигурацией, вам необходимо повторно проиндексировать все, чтобы принять изменения.
Ответ 3
Я использовал это как тип поля:
<fieldType name="string" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
И определил мои поля, используя:
<field name="address" type="string" indexed="true" stored="true"/>
Результат: Мой документ возвращает поля в правильном случае (например, вставлен), и я могу искать регистр без учета регистра (используя буквы верхнего и нижнего регистра)...
Версия: Solr 3.6
Ответ 4
Я использовал что-то вроде этого...
В schema.xml я поместил новый fieldType
<fieldType name="newType" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
</fieldType>
Назначьте новый тип полю, которое вы хотите сделать его случайным и без пробелов
Затем вы должны построить запрос solr в форме: fieldName:(*fieldValue\ *)
Ответ 5
вместо type="string"
определить поле type="text_general"
(как определено в файле schema.xml по умолчанию). По его свойству ignore case=true
Ответ 6
Как вы делаете регистр нечувствительным к коллекции, которая использует динамическую схему (или схему, управляемую данными)? Коллекция была создана как:
su - solr -c "/opt/solr/bin/solr create -c Mock2 -n data_driven_schema_configs"