我已在文本类型字段中索引了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?
我怎样才能做到这一点?请建议。
答案 0 :(得分:1)
StandardTokenizerFactory
将明确拆分-
上的任何令牌:
请注意,单词以连字符分开。
ClassicTokenizerFactory
是同一个Tokenizer的旧版本,但它有一个特殊规则:
单词用连字符分开,除非单词中有数字,在这种情况下,标记不会被分割,数字和连字符会被保留。
这是否合适取决于您的输入。如果你有726719-BAT,那么它就不合适了。
另一种选择是只使用WhitespaceTokenizerFactory
,它只会在实际的空格上进行分割(java的测试isWhitespace()
评估为真)。
但是,如果您只将726719-B21
索引到字段中并且只想完全匹配它,则可以使用StrField(通常在架构中定义为string
) - 或者如果你希望它不区分大小写,使用KeywordTokenizer
和小写过滤器。
您在序列中定义的其他过滤器也可能以基本方式更改您的内容(例如词干,如果它们与任何预定义的模式匹配,则会删除标记的结尾)。
答案 1 :(得分:-2)
您始终可以近距离搜索。
这很令人头疼,但您无需重新索引数据。
“726719 B21”~1
它并不完美(因为它会找到B21-727719)但它可能已经足够了。