1

假设我有一个字段类型如下:

<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”。

我希望将索引以下标记:

"My", "my", "dog", "barking", "bark", "dogs", "#DOGS".

我考虑了 WordDelimiterGraphFilterFactory 中的“perserveOriginal”参数,但它仅适用于具有特殊字符的标记,并且“原始标记”之后通过其他过滤器。

我知道最明显的方法是编写一个自定义的 TokenFilter,在标记器之后立即以原始形式索引标记,但我的问题是 Solr 中是否有内置的东西允许它。

我正在使用 Solr 6.5.1

谢谢 :)

4

1 回答 1

1

与保持搜索自然语言相关性的好问题,可能会有所帮助。

如果要搜索的字段只是提到的字段类型,即“text_body”,并且您希望同时拥有词干和原始 tokan 来搜索要搜索的文件列表中的所有文件;

然后尝试使用另一个字段类型(例如“text_body”)创建一个附加字段(例如 field_withoutStemmer),但不使用以下过滤器:

<filter class="solr.PorterStemFilterFactory"/>

除此之外,如果您使用的是 dismax/edismax 查询解析器,那么您可能希望将“tie”参数设置为非零值(可能 tie=1.0)。

设置 "tie=1.0" 将生成文档的分数 = 匹配文档的两个字段的分数之和;否则它将分离,您将在两个领域中仅获得最高分之一。

于 2020-05-01T18:38:32.027 回答