【问题标题】:Rails sunspot-solr - words with hyphenRails sunspot-solr - 带连字符的单词
【发布时间】:2023-03-15 15:28:01
【问题描述】:

我正在使用 sunspot_rails gem,到目前为止一切正常,但是:我没有得到任何带有连字符的单词的搜索结果。

示例: 字符串“tron”返回很多结果(所有文章中提到的词都是e-tron)

字符串“e-tron”返回 0 个结果,即使这是我所有文章中提到的正确单词。

我当前的 schema.xml 配置:

    <fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

我想要的:搜索字符串 tron 的行为当然没问题,但我也希望搜索字符串 e-tron 有正确的匹配项。

【问题讨论】:

    标签: ruby-on-rails n-gram sunspot-solr


    【解决方案1】:

    问题在于 solr.StandardTokenizerFactory 用连字符分割单词,因此“e-tron”生成标记“e”、“tron”。据推测,“e”作为 solr.TextField 过滤器丢失,最小标记大小为 2。

    这是一个可以显示您的具体问题的示例。

    <fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
    
    1. solr.WhitespaceTokenizerFactory 将在空白处生成令牌。 ["e-tron"]
    2. solr.WordDelimiterFilterFactory 将拆分连字符,但也会保留原始单词。 ["e", "tron", "e-tron"]

    【讨论】:

    • 嗯,这是一个改进,但现在我得到了 156 次 e-tron 命中和 32 次 tron 命中 - 这不可能是正确的 :(
    • "e-tron" 将同时查找 "e-tron" 和 "tron",因此可以通过这种方式找到更多结果。这会给你线索吗?在不知道您得到什么结果的情况下,我不能说更多。
    • 好的,这是一个很好的线索。也许我们这里有一个误解:搜索字符串“e-tron”只需要查找带有“e-tron”这个词的文章(无需搜索“tron” - 那将是一个奖励)。我唯一需要的是:每次搜索“e-tron”都会找到“e-tron”的所有内容,每次搜索“tron”都会找到“tron”和“e-tron”的所有内容——我希望你明白我的意思.感谢您迄今为止的所有帮助。
    • 然后只需删除 WordDelimiterFilterFactory。如果您查看文档,它明确表示它以“-”分隔。 wiki.apache.org/solr/…
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多