Xml Solr分析器以及标记器和过滤器的顺序
调试SOLR筛选器很困难,因为您看不到结果。 从执行的测试来看,分析器中的顺序似乎总是首先运行标记器,然后运行过滤器,而不管XML中的顺序如何 怀疑的理由,在这里Xml Solr分析器以及标记器和过滤器的顺序,xml,solr,tokenize,analyzer,Xml,Solr,Tokenize,Analyzer,调试SOLR筛选器很困难,因为您看不到结果。 从执行的测试来看,分析器中的顺序似乎总是首先运行标记器,然后运行过滤器,而不管XML中的顺序如何 怀疑的理由,在这里 <!-- all to lower case --> <filter class="solr.LowerCaseFilterFactory"/> <!-- first convert all to ASCII --> <filter class=
<!-- 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"/>
这个想法是,例如,如果你有一个像荥阳这样的名字,它将崩溃为荥阳,如果我们愿意,我们可以搜索它。然而,这不适用于StandardTokenizerFactory(我们在搜索盈阳时没有得到任何结果),但如果我们改为使用关键字Tokenizer,它确实有效。这表明破折号导致了标记化。正则表达式应该删除破折号。它确实与关键字标记器一起工作的事实证明正则表达式工作良好
那么,有人知道SOLR中的分析器要求首先运行标记器是否存在限制吗?所有在线示例都首先显示标记器,因此我不知道是否有人在标记化之前尝试过过滤。您的观察是正确的-标记器总是在过滤器之前运行,但CharFilters甚至在过滤器之前运行 您可以使用
PatternReplaceCharFilterFactory
在标记器看到您的字符串之前运行替换:
<charFilter class="solr.PatternReplaceCharFilterFactory"
pattern="[^a-z0-9\s]" replacement="" />
<tokenizer ...>
而您最初的假设是错误的(即“调试SOLR过滤器很困难,因为您看不到结果”)。如果您在Solr Admin中转到核心/集合,并在集合菜单中选择“分析”链接,您将获得所有已定义字段的下拉列表。在左侧输入要输入到索引中的文本,在右侧输入您希望用户键入的查询,您将获得为链中的每个步骤生成的标记,并且可以确切地看到任何charfilters、标记器和任何后续过滤器如何处理这些标记
在您的情况下,WhitespaceTokenizer可能比StandardTokenizer更合适,但这也意味着当名称为“Ying yang”时,仅搜索“Ying”不会给您带来成功。在这种情况下,您可以使用不同的分析链定义多个字段,并使用copyField指令将相同的内容复制到这些不同的字段中。然后,你可以使用<代码> QF(用EDISMAX处理程序)来搜索不同的字段,并根据你认为字段的准确程度来应用不同的权重(即在一个精确的字段中给出比在<代码>标准化标记器中的字段更大的权重)。正确:WhitespaceTokenizer是我现在修补这个的方式;如果我们使用charFilter,然后使用StandardTokenizer,那么行为是相同的,因为我们是故意崩溃的。事实上,我们已经为不同的用例准备了拷贝字段。尽管如此,还是要感谢您,这对其他人很有帮助。如果您先用
charFilter
删除破折号,那么对于StandardTokenizer应该没有什么可拆分的。在这种情况下,我很想看到分析输出和该字段的定义。