【问题标题】:migrating from Solr 5.2 to Solr 8.2 -- query using edismax not yielding results从 Solr 5.2 迁移到 Solr 8.2 -- 使用 edismax 查询不产生结果
【发布时间】:2021-03-28 04:32:36
【问题描述】:

我正在尝试来自 solr 的以下查询:

    http://localhost:8393/solr/core-name/select?defType=edismax&fl=product_id_i,ProductName_ten&q=cnmg+432+ud32&q.op=AND&qf=ProductName_ten_ngram

在 Solr 5.2 上,我收到一份文档,其中包含以下结果:

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
<lst name="params">
<str name="fl">product_id_i,ProductName_ten</str>
<str name="q">cnmg 432 ud32</str>
<str name="qf">ProductName_ten_ngram</str>
<str name="q.op">AND</str>
<str name="defType">edismax</str>
</lst>
</lst>
<result name="response" numFound="1" start="0">
<doc>
<int name="product_id_i">1521210</int>
<str name="ProductName_ten">
CNMG 432 ZM1 UD32, 1/32″ Corner Radius, 3/16″ Thick, 1/2″ Inscribed Circle, Turning Indexable Insert
</str>
</doc>
</result>
</response>

但是,在 Solr 8.2 上,找不到该文档,我得到以下结果:

{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"cnmg 432 ud32",
      "defType":"edismax",
      "qf":"ProductName_ten_ngram",
      "fl":"product_id_i,ProductName_ten",
      "q.op":"AND"}},
  "response":{"numFound":0,"start":0,"docs":[]
  }}

两个系统的schema.xml文件基本相同,字段定义如下:

<dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
<field name="ProductName_ten_ngram" type="text_gen_text_only_ngram" indexed="true" stored="false" multiValued="false"/>
<dynamicField name="*_ten"  type="text_en"    indexed="true"  stored="true" />
<fieldType name="text_gen_text_only_ngram" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.PatternReplaceFilterFactory" pattern="[^a-z0-9.\/]" replacement="" replace="all" />
        <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="2" outputUnigrams="true" outputUnigramsIfNoShingles="true" tokenSeparator="-"/>
        <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.PatternReplaceFilterFactory" pattern="[^a-z0-9.\/]" replacement="" replace="all" />
        <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="2" outputUnigrams="false" outputUnigramsIfNoShingles="true" tokenSeparator="-"/>
      </analyzer>
   </fieldType>

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <!-- Case insensitive stop word removal.
        -->
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="lang/stopwords_en.txt"
                />
        <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
    -->
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.ManagedStopFilterFactory" managed="english" />
        <filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" />
        <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
    -->
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
    </fieldType>

<copyField source="ProductName_ten" dest="ProductName_ten_ngram"/>

问题是——为什么在 Solr 5.2 中返回的结果没有在 Solr 8.2 中返回?

【问题讨论】:

  • 如果您查看 Solr 管理员下的字段,您是否看到了您期望的术语?如果您在该领域进行比赛,您会收到任何参赛作品吗?
  • 如果我不是通过搜索查询,而是查询 fq=product_id_i: 1521210 那么我确实得到了带有 ProductName_ten 的 solr 文档:“CNMG 432 ZM1 UD32, 1/32″ Corner Radius, 3/16 ″ 厚 1/2″ 内切圆车削可转位刀片"
  • 当然,但这并不能告诉我们有关ProductName_ten_ngram 的处理方式的任何信息。您的第一个查询已经显示该文档已按您的预期编入索引。但是,您的字段包含 KeywordTokenizer 并且没有发生 ngramming(您的链中没有任何 ngram 过滤器)。你期望会发生什么?据我所知,该字段中唯一索引的内容是单个长标记,其中包含该字段的完整文本。
  • 我看到我在架构中遗漏了部分字段类型定义。编辑它。它确实在“索引”分析器下包含 ngram。
  • 然后使用 Solr admin 下的 Analysis 页面并输入索引内容和您的查询,并查看生成的令牌不匹配的原因 - 词干可能是这里的问题之一。

标签: solr edismax


【解决方案1】:

似乎 solr 5.2 和 solr 8.2 读取架构的方式不同,并且与显式字段名称 = 'text_gen_text_only_ngram' 和动态字段名称 = 'text_en_ngram' 分析器存在冲突

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 2023-03-26
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2016-10-06
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多