【问题标题】:Solr search issue with "-" hyphen delimiters带有“-”连字符分隔符的 Solr 搜索问题
【发布时间】:2016-02-10 16:49:53
【问题描述】:

我已在分析器下方应用的文本类型字段中为 726719-B21 编制索引。

<analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>

现在,当我搜索此单词时,连字符用作分隔符,因此它将获取包含 726719 以及 B21 的结果。我只想要具有 726719-B21 的结果。

如何使用/配置 WordDelimiterFilterFactory 搜索词 726719-B21?

我怎样才能做到这一点?请提出建议。

【问题讨论】:

    标签: solr


    【解决方案1】:

    StandardTokenizerFactory 将明确拆分- 上的任何令牌:

    请注意,单词在连字符处分开。

    ClassicTokenizerFactory 是同一个 Tokenizer 的旧版本,但它有一个特殊的规则:

    单词在连字符处被分割,除非单词中有数字,在这种情况下,标记不会被分割并且数字和连字符被保留。

    这是否合适取决于您的意见。如果你能有 726719-BAT,那它就不适合了。

    另一种选择是只使用WhitespaceTokenizerFactory,它只会在实际空白处拆分(java 的测试isWhitespace() 评估为真)。

    但是,如果您只是将 726719-B21 索引到该字段中并且只想完全匹配它,则可以使用 StrField 代替(通常在您的架构中定义为 string) - 或者如果您希望它是大小写不敏感,使用KeywordTokenizer 和小写过滤器。

    您在序列中定义的其他过滤器也可能会以基本方式更改您的内容(例如词干提取,如果它们与任何预定义的模式集匹配,则标记的末尾将被删除)。

    【讨论】:

    • 我已经尝试过使用 WhitespaceTokenizerFactory,但没有运气。此外,我无法将其添加到字符串字段或 StrField 中。因为要求也是用小写搜索。
    • @Ankita 请记住,您必须在更改标记器后重新索引任何内容,而我对 KeywordTokenizer 的其他建议将按原样保留该值,但可能使用小写过滤器使其不区分大小写.
    【解决方案2】:

    您始终可以使用邻近搜索。

    这很令人头疼,但您不需要重新索引数据。

    “726719 B21”~1

    它并不完美(因为它会找到 B21-727719)但它可能已经足够好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多