【问题标题】:Solr synonym graph filter not working after other filterSolr同义词图过滤器在其他过滤器之后不起作用
【发布时间】:2020-01-29 09:45:40
【问题描述】:

我正在尝试将 15.6" 搜索转换为 15.6 inch。想法是首先将15.6" 替换为15.6 ",然后将" 与同义词规则" => inch 匹配。 我创建了类型定义:

<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.PatternReplaceFilterFactory" pattern='^([0-9]+([,.][0-9]+)?)(")$' replacement="$1 $3" />
        <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" />
    </analyzer>
</fieldType>

但它不起作用!如果我输入15.6" 我得到15.6 ",但是当我输入15.6 " 我得到我想要的 - 15.6 inch

为什么它不起作用?我错过了什么吗?

编辑:

Solr 分析:

【问题讨论】:

  • 在这种情况下你不能用$1 inch代替它,而不是通过同义词吗?使用 Solr 管理下的 Analysis 页面来查看每个步骤的令牌是如何处理的——它应该能够告诉你在 patternreplacefilter 完成后一切都是什么样子。看起来有子组而不是子组,所以 $3 可能是错误的,除非你移动结尾 ))。
  • 我想我可以,但我可能想稍后将 PatternReplaceFilter 用于" 以外的字符。另一方面,上面的方法似乎完全合乎逻辑,除了它不起作用,所以我想知道它背后是否有一些推理......
  • 这就是为什么您要使用 Solr 管理员的分析页面来查看链中每个步骤的确切情况 - 届时问题应该会很明显。,
  • 感谢您的关注。我现在使用 Solr 分析编辑了我的帖子。我之前已经做过,但无法从中推断出任何东西。
  • 我想我现在明白了。 PatternFilter 之后15.6 " 还是一个token,显然15.6 "" 是不一样的。有没有办法解决这个问题?

标签: solr synonym


【解决方案1】:

问题是15.6 " 在您的模式替换过滤器之后仍然是一个标记 - 只是创建一个带有空格的标记不会拆分它。

您可以看到它仍然保留为单个标记,因为行上没有|(用于分隔标记)。

在它之后添加一个单词分隔符过滤器(从您的分析链看来,您已经有了一个,只是没有包含在您的问题中),或者更好的是,在PatternReplaceCharFilterFactory 中进行替换之前 em> 标记器获得将输入拆分为单独标记的任务:

<analyzer>
  <charFilter class="solr.PatternReplaceCharFilterFactory" pattern='^([0-9]+([,.][0-9]+)?)(")$' replacement="$1 $3" />
  <tokenizer ...>

您可能需要稍微调整模式匹配器(即丢失 Solr 不尊重的 ^ 和 $,iirc)取决于您的输入(因为它现在将应用于整个输入字符串 -确保正确匹配“Macbook 15.6”256GB)。

【讨论】:

  • 我尝试在标记化之前进行模式匹配,但似乎 Solr 会先自动调用标记器。我也尝试添加另一个标记器,但 Solr 不喜欢这样。
  • 您必须将其添加为charFilter。这个很重要。如果你只是添加一个过滤器,它会在分词器之后依次调用。首先应用字符过滤器,然后是标记器,然后是过滤器。 WordDelimiterGraphFilter 也可以执行标记器可以执行的一些操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2022-11-24
相关资源
最近更新 更多