SOLR регистронезависимый поиск - PullRequest
16 голосов
/ 23 ноября 2011

У меня проблема в SOLR Search.
У меня есть такие данные:
enter image description here

Я использую solr admin, чтобы найти эти данные с помощью запроса, подобного следующему:

address_s:*Nadi*

и нашел эти данные. Но когда я использую этот запрос:

address_s:*nadi*

ничего не найдено.
Я погуглил и нашел ответ, чтобы создать поле со следующим скриптом:

<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>

Я скопировал и вставил этот скрипт в schema.xml, но он все равно не работает. Что я должен делать? Кто-нибудь может мне помочь?

Ответы [ 5 ]

12 голосов
/ 23 ноября 2011

Поле 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 в индексе, и вам нужно будет вводить строчные буквы на стороне клиента.

7 голосов
/ 28 июня 2012

Я использовал это как тип поля:

<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

5 голосов
/ 23 ноября 2011

Использует ли ваше поле address_s этот тип поля c_text в вашем schema.xml?

Если ваш индекс был создан с предыдущей конфигурацией, вам нужно переиндексировать все, чтобы учесть изменения.

1 голос
/ 30 сентября 2013

вместо type="string" определяют поле type="text_general" (как определено в schema.xml по умолчанию). На данный момент его собственность составляет ignore case=true

1 голос
/ 19 июня 2013

Я использовал что-то вроде этого ... В 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\ *)

...