Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml Solr分析器以及标记器和过滤器的顺序_Xml_Solr_Tokenize_Analyzer - Fatal编程技术网

Xml Solr分析器以及标记器和过滤器的顺序

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=

调试SOLR筛选器很困难,因为您看不到结果。 从执行的测试来看,分析器中的顺序似乎总是首先运行标记器,然后运行过滤器,而不管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"/>

这个想法是,例如,如果你有一个像荥阳这样的名字,它将崩溃为荥阳,如果我们愿意,我们可以搜索它。然而,这不适用于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应该没有什么可拆分的。在这种情况下,我很想看到分析输出和该字段的定义。