Поле типа «string». Запрос не возвращает результатов, даже если строка запроса сохранена в таком поле

#solr

#solr

Вопрос:

Я отлаживаю проблему поиска в приложении, использующем Solr-Search. У нас там есть поле с именем «author», определенное в schema.xml. Мы видим документы со значением в нем, поэтому это поле индексируется должным образом, как кажется. Но мы не получаем никаких результатов при поиске некоторого содержимого в таком поле.

Исходное определение поля таково:

 <field name="author" type="string" indexed="true" stored="true" docValues="true" />
  

Если есть индексированное значение типа «Mad Max», нет результата ни для «Mad», «Max», ни для «Mad Max».
Но когда есть значение типа «MadMax», будет результат, если мы будем искать именно «MadMax». Ни «madmax», ни что-либо еще не работает.

Теперь я прочитал в документах для Solr 6 следующее для встроенного типа «StrField» (правильный ли это тип для «string»?).

Строки предназначены для небольших полей и никак не маркируются и не анализируются.

https://lucene.apache.org/solr/guide/6_6/field-types-included-with-solr.html

Означает ли это, что type=»string» предназначен только для строк из одного слова (см. «не маркировано»), которые должны точно совпадать (см. «никоим образом не анализируется»)?

Или есть какая-то другая настройка, при которой поведением полей типа «string» можно управлять таким образом, чтобы можно было достичь частичных совпадений содержимого из нескольких слов без учета регистра?

Ответ №1:

Означает ли это, что type=»string» предназначен только для строк из одного слова (см. «не маркировано»), которые должны точно совпадать (см. «никоим образом не анализируется»)? ДА

Или есть какая-то другая настройка, при которой поведением полей типа «string» можно управлять таким образом, чтобы можно было достичь частичных совпадений содержимого из нескольких слов без учета регистра? НЕТ

Если у вас есть тип поля string, поле не будет проанализировано. Не будет никакой токенизации строки, даже если строка состоит из нескольких слов.

Если вы хотите добиться поиска точного слова, тогда вам следует выбрать тип string.

Если вы хотите добиться точного поиска с учетом регистра, тогда создайте свое собственное поле с KeywordTokenizerFactory и LowerCaseFilterFactory factory.

 <fieldType name="text_phrase" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
  

Если вы хотите добиться точного поиска и поиска по шаблону, такого как поиск по одному слову, тогда вы можете использовать WhitespaceTokenizerFactory и комбинации LowerCaseFilterFactory и StopFilterFactory и т.д.

 <fieldType name="text_custom" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" splitOnCaseChange="1"/>
  <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
  

Таким образом, KeywordTokenizerFactory будет иметь токен типа "web world" в качестве отдельного токена в индексе.

WhitespaceTokenizerFactory создаст токены типа "web ", "world" .

Вы можете видеть разницу, она не будет совпадать. Вы ищете "web", "world" против "web world" .

После того, как вы создали свой собственный тип поля, вы можете проверить то же самое на странице администратора solr. Какие все токены созданы и соответствует ли он какому-либо.

Вы даже можете управлять анализом типа индекса и типа запроса, используя разные маркеры и фильтры.

Комментарии:

1. Спасибо за разъяснение! Работает с WhitespaceTokenizerFactory и LowerCaseFilterFactory.