【问题标题】:Solr index-time tokenizer / filter not working as expected?Solr 索引时间标记器/过滤器未按预期工作?
【发布时间】:2019-06-26 17:52:38
【问题描述】:

我正在使用我公司早些时候设置的 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=*&amp;rows=10&amp;start=0&amp;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 在其中?) 我在这里想念什么?感谢任何见解:)

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    您的 S_DSC 字段未编入索引:

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

    未索引的字段永远不会产生命中。我的猜测是,您的点击来自其他已编入索引的未处理字段之一,这就是您得到所见行为的原因。

    当您将debug=all 附加到您的查询中时,每个找到的文档都会显示每个字段匹配的词频(即构成分数的因素),让您可以查看哪些字段产生了命中。

    【讨论】:

    • 哦,很好。我完全忽略了这一点。我猜是痴迷于“存储”领域。欣赏!
    猜你喜欢
    • 2021-05-09
    • 2011-05-22
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多