Solr index-time tokenizer / filter не работает должным образом? - PullRequest
0 голосов
/ 26 июня 2019

Я работаю с экземпляром solr, настроенным ранее в моей компании, и, похоже, он настроен неправильно.Я могу искать что-то вроде q=*Paper* для получения результатов, но не для paper.

Похоже, что токенизатор / фильтр индексного времени работает не так, как я ожидал.

schema.xml настроен для токенизации, а затем индексации и запроса без учета регистра в этом поле описания, например:

<field name="S_DSC" type="string_search" indexed="false" stored="true" required="false"/>
...etc... 

<fieldType name="string_search" class="solr.TextField">
  <analyzer type="index">
        <!--Split at whitespaces and at punctuations. Strip other special characters.-->
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <!--Plural words handling. 'dogs'='dog'. Stemming not recommended. dry 'erase' board is not the same as dry board 'eraser'-->
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
      </analyzer>
</fieldType>

И solrconfig.xml имеет значение по умолчанию qfна:

<requestHandler name="/select" class="solr.SearchHandler">
  <lst name="defaults">
      <str name="spellcheck">false</str>
      <str name="spellcheck.dictionary">default</str>
      <str name="spellcheck.dictionary">wordbreak</str>
      <str name="spellcheck.onlyMorePopular">true</str>
      <str name="spellcheck.extendedResults">false</str>
      <str name="spellcheck.collate">true</str>
      <str name="spellcheck.count">3</str>
      <str name="spellcheck.maxCollations">1</str>
      <str name="spellcheck.maxCollationTries">10</str>
      <str name="defType">synonym_edismax</str>
      <str name="synonyms">false</str>
      <str name="qf">C_PN^20.0 PN^15.0 C_S_DSC^10.0 S_DSC^10.0 M_PN^5.0 DIM_NM^2.0 BRD^2.0 combined_search^1</str>
  <str name="a">{!type=synonym_edismax qf=$qf v=$q}</str>
  </lst>

Когда я запрашиваю q=*, я получаю результаты select?q=*&rows=10&start=0&wt=json

    "docs": [
        {
            "S_DSC": "Foo 8.5\" x 11\" Copy Paper, 20 lbs, 92 Brightness, 5000/Carton (123456)"
            ...etc...
        },

Но если я пытаюсь найти термин в описании (S_DSC), яЯ не получаю результаты, если он не чувствителен к регистру И я ставлю звездочки вокруг него.

Я получаю результаты для q=*Paper*

"parsedquery": "(+DisjunctionMaxQuery((combined_search:*paper* | PN:*Paper*^15.0 | S_DSC:*paper*^10.0 | C_PN:*Paper*^20.0 | BRD:*Paper*^2.0 | M_PN:*Paper*^5.0 | DIM_NM:*Paper*^2.0 | C_S_DSC:*paper*^10.0)))/no_coord",

Нет результатов для q=paper

"parsedquery": "(+DisjunctionMaxQuery((combined_search:paper | PN:paper^15.0 | S_DSC:paper^10.0 | C_PN:paper^20.0 | BRD:paper^2.0 | M_PN:paper^5.0 | DIM_NM:paper^2.0 | C_S_DSC:paper^10.0)))/no_coord",

Нет результатов для q=Paper

"parsedquery": "(+DisjunctionMaxQuery((combined_search:paper | PN:Paper^15.0 | S_DSC:paper^10.0 | C_PN:Paper^20.0 | BRD:Paper^2.0 | M_PN:Paper^5.0 | DIM_NM:Paper^2.0 | C_S_DSC:paper^10.0)))/no_coord",

Разве это не должно быть токенизация S_DSC выше, чем нижний регистр токенов?(Так что paper среди них?) Что мне здесь не хватает?Цени любое понимание:)

1 Ответ

2 голосов
/ 27 июня 2019

Ваше поле S_DSC не проиндексировано:

<field name="S_DSC" type="string_search" --> indexed="false"  <--

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

Когда вы добавляете debug=all к вашему запросу,В каждом найденном документе будет отображаться термин «частота совпадения» (то есть, что составляет оценку) для каждого поля, что позволяет увидеть, какие поля генерируют совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...