Solr搜索问题" - "连字符分隔符

时间:2016-02-09 06:31:58

标签: solr

我已在文本类型字段中索引了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?

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

2 个答案:

答案 0 :(得分:1)

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

  

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

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

  

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

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

另一种选择是只使用WhitespaceTokenizerFactory,它只会在实际的空格上进行分割(java的测试isWhitespace()评估为真)。

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

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

答案 1 :(得分:-2)

您始终可以近距离搜索。

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

“726719 B21”~1

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