【问题标题】:Indexing original tokens in solr在 solr 中索引原始标记
【发布时间】:2020-04-26 10:26:56
【问题描述】:

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

<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" 

“is”会因为 stopWords 过滤器而被删除,“barking”会因为词干过滤器而变成“bark”。

我希望将以下标记编入索引:

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

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

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

我正在使用 Solr 6.5.1

谢谢:)

【问题讨论】:

  • 将原始令牌保留在同一字段中的用例是什么?为什么不使用包含未应用过滤器的原始标记的专用字段?
  • @MatsLindh 当然,您的建议是可能的并且适合,我仍在考虑所有选项。我只是想知道是否有可能将它保持在同一个领域(我的意思是使用 solr 中构建的东西,而不编写额外的插件),然后才考虑将它作为一个选项。谢谢:)
  • 在这种情况下,我建议这样做 - 为相同的内容使用不同的字段但具有不同的处理是 Lucene 和 Solr 的核心租户之一,而不是混合不同处理的令牌。

标签: indexing solr nlp solrcloud solr-schema


【解决方案1】:

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

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

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

<filter class="solr.PorterStemFilterFactory"/>

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

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

【讨论】:

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