Solr 分析器以及分词器和过滤器的顺序

Solr analyzers and order of tokenizers and filters

调试 SOLR 过滤器很困难,因为您看不到结果。 从执行的测试看来,Analyzer 中的顺序似乎总是 运行 首先是 Tokenizer,然后是 过滤器,无论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 中的分析器是否存在限制,他们要求分词器首先是 运行?所有在线示例都首先显示分词器,所以我不知道是否有人在分词之前尝试过过滤。

您的观察是正确的 - 分词器总是 运行 在过滤器之前,但 CharFilters 运行 甚至更早。

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

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

并且您最初的假设是错误的(即 "Debugging SOLR filters is difficult because you can't see the result.")。如果您转到 Solr Admin 中的核心/集合并在集合菜单中 select "Analysis" link,您将获得所有已定义字段的下拉列表。在左侧输入您想要输入到索引中的文本,在右侧输入您希望用户输入的查询,您将获得为链中的每个步骤生成的令牌,并且可以准确地看到它们是如何“正在处理任何字符过滤器、分词器和任何后续过滤器。

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