【问题标题】:Solr analyzers and order of tokenizers and filtersSolr 分析器以及标记器和过滤器的顺序
【发布时间】:2019-09-18 16:19:58
【问题描述】:

调试 SOLR 过滤器很困难,因为您看不到结果。 从执行的测试看来,Analyzer 中的顺序似乎总是先运行 Tokenizer,然后运行 ​​Filters,无论顺序如何XML。

可疑的原因,这里

      <!-- all to lower case -->
      <filter class="solr.LowerCaseFilterFactory"/>
      <!-- first convert all to ASCII -->
      <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
      <!-- all punctuation replaced by nothing -->
      <filter class="solr.PatternReplaceFilterFactory" pattern="([^a-z0-9\s]+)" replacement=""  replace="all"/>
      <tokenizer class="solr.StandardTokenizerFactory"/>

这个想法是,例如,如果你有一个像 Ying-yang 这样的名字,它会折叠为 yingyang,如果我们愿意,我们可以搜索它。然而,这不适用于 StandardTokenizerFactory(我们没有搜索到 yingyang 的结果),但如果我们使用 KeywordTokenizer 则确实有效。这表明破折号导致了标记化。正则表达式应该删除了破折号。它确实与 KeywordTokenizer 一起工作的事实证明正则表达式工作正常。

那么是否有人知道 SOLR 中的分析器是否需要首先运行标记器是一个限制?网上所有的例子都先显示一个分词器,所以我不知道是否有人在分词之前尝试过过滤。

【问题讨论】:

    标签: xml solr tokenize analyzer


    【解决方案1】:

    您的观察是正确的 - 标记器总是在过滤器之前运行,但 CharFilters 甚至在此之前运行。

    您可以在标记器看到您的字符串之前使用PatternReplaceCharFilterFactory 运行替换:

    <charFilter class="solr.PatternReplaceCharFilterFactory"
             pattern="[^a-z0-9\s]" replacement="" />
    <tokenizer ...>
    

    您最初的假设是错误的(即“调试 SOLR 过滤器很困难,因为您看不到结果。”)。如果您在 Solr Admin 中转到您的核心/集合并选择集合菜单中的“分析”链接,您将获得所有已定义字段的下拉列表。在左侧输入您要输入到索引中的文本,在右侧输入您希望用户输入的查询,您将获得为链中的每个步骤生成的令牌,并且可以准确地看到它们的方式正在为任何 charfilters、tokenizer 和任何后续过滤器进行处理。

    在您的情况下,WhitespaceTokenizer 可能比 StandardTokenizer 更适合,但这也意味着当名称为“Ying-yang”时,仅搜索“Ying”不会给您带来成功。在这种情况下,您可以定义具有不同分析链的多个字段,并使用 copyField 指令将相同的内容复制到这些不同的字段中。然后,您可以使用qf(使用 edismax 处理程序)来搜索不同的字段,并根据您认为该字段的精确程度应用不同的权重(即,在精确字段中的命中比带有 @ 的字段赋予更大的权重987654324@).

    【讨论】:

    • 谢谢;正确:WhitespaceTokenizer 是我现在修补它的方式;如果我们使用 charFilter 然后 StandardTokenizer 因为我们故意折叠,行为是相同的。事实上,我们有针对不同用例的复制字段。不过还是谢谢,对其他人有帮助。
    • 如果您首先使用charFilter 删除破折号,那么对于 StandardTokenizer 应该没有什么可拆分的。在这种情况下,我会很高兴看到分析输出和该字段的定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2020-12-26
    • 2021-05-09
    • 1970-01-01
    • 2016-09-07
    • 2020-01-17
    相关资源
    最近更新 更多