Solr:在索引前去除标点符号

Posted

技术标签:

【中文标题】Solr:在索引前去除标点符号【英文标题】:Solr: strip punctuation before index 【发布时间】:2011-03-10 03:44:03 【问题描述】:

我在从 solr 索引中删除标点符号时遇到问题 如果标点符号紧跟在一个单词之后,则该单词没有被正确索引。

例如:如果我们索引“hello, John”,那么关键字“hello”将不会找到该资产,而如果我们删除“hello”后的逗号则没有问题。

是否有任何 FilterFactory 可以去除标点符号?有什么想法吗?

谢谢, 波格丹。

【问题讨论】:

【参考方案1】:

您可以使用solr.PatternReplaceFilterFactory 去掉开头和结尾的标点符号:

<filter class="solr.PatternReplaceFilterFactory"
    pattern="^\pPunct*(.*?)\pPunct*$"
    replacement="$1"/>

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

<filter class="solr.PatternReplaceFilterFactory"
    pattern="^[\pPunct&&[^$]]*(.*?)\pPunct*$"
    replacement="$1"/>

【讨论】:

我相信 Mason 的编辑彻底改变了这个答案。他应该再补充一个答案。 @CorayThan 改变如何过于激进?我稍微调整了claytron原始答案上的正则表达式,因为捕获标点符号只是为了稍后将其丢弃是不必要的,然后添加了一个示例,说明如何进一步调整该正则表达式,如果一个人希望删除除特定字符之外的所有标点符号......这可能非常有用。对我来说,两者似乎都不是一个完全不同的答案,所以这样发布似乎不正确。【参考方案2】:

这是通过 WordDelimiterFilterFactory 完成的。设置 generateWordParts=1。

还有PatternTokenizerFactory可以用,不过没试过。

【讨论】:

对于像我这样有边缘情况的人: generateWordParts=1 通常可以工作,但如果你正在做我正在做的事情,它不会:我正在使用 types 属性的 WDFF 映射。和 $ 到 ALPHA,这样我就可以匹配像 $10.00 这样的术语。这具有导致前缀和后缀句点被包含在单词中的负面影响。所以就我而言,@claytron 的答案可能更合适。【参考方案3】:

使用 PatternReplaceFilterFactory

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

...

【讨论】:

以上是关于Solr:在索引前去除标点符号的主要内容,如果未能解决你的问题,请参考以下文章

easyuitree节点前的三角符号怎么去掉

近期遇到问题总结

去除文本中标点符号的java程序

如何使用 NLTK 分词器去除标点符号?

Python使用jieba库分词并去除标点符号

php 如何将数字 负号去除