Поиск без учета регистра SOLR

У меня проблема в поиске SOLR.
У меня есть такие данные:
введите здесь описание изображения

Я использую 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, но он все равно не работает. Что я должен делать? Может кто-нибудь мне помочь?


person Praditha    schedule 23.11.2011    source источник


Ответы (5)


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

person Jayendra    schedule 23.11.2011
comment
Я следовал вашей инструкции, но это все еще не работает. Я копирую и вставляю <field name="address_s" type="c_text" indexed="true" stored="true"/> в schema.xml, повторно запускаю java -jar start.jar и пытаюсь выполнить запрос. Извините, я хочу сначала спросить, я использовал schema.xml в ..\solr_302\example\solr\conf, верно? - person Praditha; 24.11.2011
comment
эй, это работа, мне нужно сначала повторно вставить документ. спасибо,. Вы знаете, как определить эти поля через PHP? поэтому мне не нужно определять его в schema.xml вручную. - person Praditha; 24.11.2011
comment
However, query address_s:*Nadi* would not, as Nadi will not match nadi in index -- Но разве не в этом смысл наличия LowerCaseFilterFactory в <analyzer type="query" />, чтобы запросы автоматически переводились в нижний регистр? - person Madbreaks; 28.06.2012
comment
Я попробовал это. Но это не работает с solr 5.3.0 - person aasha; 14.10.2015

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

<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

person Jeff Maes    schedule 28.06.2012
comment
@ Джефф Мэйс, который выдает ошибку. строка: FieldType: StrField (строка) не поддерживает указание анализатора - person Jenish; 09.10.2019

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

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

person jpountz    schedule 23.11.2011
comment
Как это сделать,.? потому что я делаю все поля с помощью php. Я ввожу все поля в массив следующим образом: $data = array(... , 'address_s' =› 'value', 'city_name_s' =› 'value', ...); и используйте функцию addDocument($data). Есть идеи.,? - person Praditha; 23.11.2011
comment
Затем вам нужно повторно запустить эти команды для всех документов, которые были добавлены в индекс. Представление данных в индексе зависит от используемого анализатора. Поэтому, если вы обновите анализатор, который используете для индексации, вам потребуется переиндексировать все ваши документы. - person jpountz; 23.11.2011
comment
извините, я до сих пор не понимаю, что мне делать, можете ли вы описать это шаг за шагом: D и когда я должен использовать тип поля c_text для всего индекса, когда я повторно запускаю свою команду php.? - person Praditha; 24.11.2011
comment
Единственное, что вам нужно сделать, чтобы заставить его работать, это повторно вставить все ваши документы в индекс. - person jpountz; 24.11.2011

Я использовал что-то вроде этого... В schema.xml я добавил новый тип поля

<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\ *)

person Manos    schedule 19.06.2013

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

person Shimon Benattar    schedule 30.09.2013