Solr 索:在索引之前去掉标点符号

Solr 索:在索引之前去掉标点符号,solr,indexing,punctuation,filterfactory,Solr,Indexing,Punctuation,Filterfactory,我在从solr索引中剥离标点符号时遇到问题 如果标点符号紧跟在一个单词之后,那么这个单词就没有正确的索引 <!-- remove punctuation --> <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/> <filter class="solr.LowerCaseFilterF

我在从solr索引中剥离标点符号时遇到问题 如果标点符号紧跟在一个单词之后,那么这个单词就没有正确的索引

<!-- remove punctuation -->
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
例如:如果我们索引“hello,John”,则不会通过关键字“hello”找到资产,而如果我们删除单词“hello”后的逗号,则不会出现问题

<!-- remove punctuation -->
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
有没有一家过滤厂想去掉标点符号?有什么想法吗

<!-- remove punctuation -->
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
谢谢,
Bogdan.

这是用WordDelimiterFilterFactory完成的。将generateWordParts设置为1

<!-- remove punctuation -->
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>

还有可以使用的,但我从未尝试过。

您可以使用
solr.PatternReplaceFilterFactory
来去除开头和结尾的标点:

<filter class="solr.PatternReplaceFilterFactory"
    pattern="^\p{Punct}*(.*?)\p{Punct}*$"
    replacement="$1"/>
<!-- remove punctuation -->
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>

如果你想去掉开头和结尾的所有标点符号,除了(例如)单词前面的美元符号,你可以使用:

<filter class="solr.PatternReplaceFilterFactory"
    pattern="^[\p{Punct}&&[^$]]*(.*?)\p{Punct}*$"
    replacement="$1"/>
<!-- remove punctuation -->
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>

使用PatternReplaceFilterFactory

<!-- remove punctuation -->
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>

。。。

对于像我这样有边缘案例的人:generateWordParts=1通常会工作,但如果你在做我正在做的事情,它不会工作:我正在使用WDFF的
类型
属性来映射。和$to ALPHA,这样我就可以匹配像
$10.00
这样的术语。这会产生负面影响,导致前缀和后缀句点包含在单词中。所以在我的例子中,@claytron的答案可能更合适。我相信梅森的编辑从根本上改变了这个答案。他应该再加上一个答案。@CorayThan这怎么太激进了?我在claytron的原始答案上稍微调整了正则表达式,因为捕获标点符号只是为了以后扔掉它是不必要的,然后添加了一个示例,说明如果想要去除除特定字符以外的所有标点符号,如何进一步调整正则表达式。。。一些可能非常有用的东西。这两个答案对我来说都不是完全不同的答案,所以把它贴出来似乎是不对的。
<!-- remove punctuation -->
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>