【问题标题】:Solr search with period in phrase is not matching - why?短语中带有句点的 Solr 搜索不匹配 - 为什么?
【发布时间】:2014-05-23 12:22:23
【问题描述】:

我在 Solr 中有一条代表公司的记录 - 公司名称位于名为“owner_name”的字段中,值为“something.net”。如果我对“owner_name:something”进行 Solr 查询,我不会得到任何结果,但如果我搜索“owner_name:something.net”,我会得到。

这是该字段使用的 fieldType 定义

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt"
                enablePositionIncrements="true"/>
        <filter class="solr.WordDelimiterFilterFactory"  preserveOriginal="1"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt"
                enablePositionIncrements="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
 </fieldType>

我不明白为什么这没有在“某物”和“网络”上被标记化。我也希望“something.net”返回结果,但大多数人只会搜索“something”。

如何同时搜索“something”和“something.net”以返回此记录?

更新

我正在寻找的词实际上是“sawhorse.net”——我只是用“某物”来表示通用。我用字段分析器玩了更多,我看到sawhorse.net 正在扩展(见屏幕截图。)似乎最后词干分析器正在改变形式,但这发生在索引和查询上,所以我仍然不确定为什么它不起作用。以下是现场分析器的截图

【问题讨论】:

  • 奇怪,根据您发布的屏幕截图,这应该会产生命中。如您所见,它略微呈灰色突出显示。
  • @cheffe - 对 - 我就是这么想的。 - 但我想通了。它们实际上存储为 SawHorse.net - 我没有意识到 H 是大写字母。请参阅下面的答案。

标签: solr


【解决方案1】:

好吧 - 我的错误 - 但也许有人可以从中吸取教训。

解决方案是名称实际上是“SawHorse.net”——我没有意识到“H”是大写的。单词分隔符将其分解为 ['sawhorse.net','saw','horse','net'] - 如果我没有 .net,那么 preserveOriginals 和 LowerCaseFilterFactory 就会匹配。

我通过添加一个 在索引和查询部分的末尾 - 结果如下所示。

“锯木”——之前

"sawhorse" - 之后

“sawhorse.net” - 之后

【讨论】:

    【解决方案2】:

    您的 &lt;analyzer type="index"&gt;&lt;analyzer type="query"&gt; 部分不匹配。您在索引上设置了 solr.WordDelimiterFilterFactory ,但没有为查询设置。这意味着如果您在查询时搜索同一个词,则如果一个词在索引时被分解(假设在一个句点上,但也可能是一个连字符或许多其他被配置为拆分词的词)时间它不会以相同的方式解析它。

    一般来说,在 Solr 中,您希望将索引过滤器和标记器与查询时间过滤器和标记器相匹配。在某些情况下您不这样做,但它们要么记录在过滤器或标记器的描述中,要么您在试验​​一段时间后针对非常具体的用例进行调整。

    有关 solr.WordDelimiterFilterFactory 所做工作的详细信息可以在此处找到 - https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多