假设我有一个字段类型如下。
<fieldType name="text_body" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" catenateWords="1" preserveOriginal="1"/>
<filter class="solr.FlattenGraphFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
我的目标是为每个标记建立索引,原始标记以及通过所有标记过滤器后的标记。 例如,对于文本,当前的字段类型(如上所述)将索引以下标记:
"My dog is barking #DOGS"
当前的字段类型(如上所述)将索引以下标记。
"my", "dog", "bark", "dogs", "#dogs"
由于stopWords过滤器,"is "将被删除,而 "barking "将由于词干过滤器变成 "bark"。
我希望下面的 tokens 会被索引。
"My", "my", "dog", "barking", "bark", "dogs", "#DOGS".
我考虑过在WordDelimiterGraphFilterFactory中使用 "perserveOriginal "参数 但它只对带有特殊字符的标记有效 而且 "原始标记 "会通过之后的其他过滤器。
我知道显而易见的方法是写一个自定义的TokenFilter,在tokenizer之后以原始形式索引token,但我的问题是Solr中是否有内置的东西允许这样做。
我使用的是Solr 6.5.1。
谢谢:)
很好的问题,与保持natura语言搜索的相关性有关,可能以下内容会有帮助。
如果要搜索的字段只有上述filedType的字段,即 "text_body",而你想同时拥有字干和原始的tokans来搜索你要搜索的文件列表中的所有文件。
然后尝试创建一个额外的字段(比如field_withoutStemmer),用另一个字段类型,比如 "text_body",但是不需要跟随过滤器。
<filter class="solr.PorterStemFilterFactory"/>
除此之外,如果你使用的是dismaxedismax查询分析器,那么你可能需要将 "tie "参数设置为非零值(可能是tie=1.0)。
设置 "tie=1.0 "将产生文档的得分=匹配文档的两个字段的得分之和,否则将产生离散,你将只有两个字段中的一个字段的最高得分。