有没有办法使用Lucene过滤器删除所有特殊字符?

7vhp5slm  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(143)

标准分析器会删除特殊字符,但不是全部(例如:'-')。我希望仅使用字母数字字符对字符串进行索引,但要引用原始文档。
范例:'doc-size type'的索引应该是'docsize'和'type',而且两者都应该指向原始文件:'文档大小类型'

gdx19jrr

gdx19jrr1#

这取决于你所说的“特殊字符”是什么意思,以及你可能有什么其他的要求。但是下面的内容可能会给予你你所需要的,或者给你指出正确的方向。
以下示例均假定Lucene版本为8.4.1。

基本示例

从您给出的非常具体的例子开始,其中doc-size type应该被索引为docsizetype,下面是一个定制的分析器:

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
import org.apache.lucene.analysis.pattern.PatternReplaceFilter;
import java.util.regex.Pattern;

public class MyAnalyzer extends Analyzer {

    @Override
    protected TokenStreamComponents createComponents(String fieldName) {
        final Tokenizer source = new WhitespaceTokenizer();
        TokenStream tokenStream = source;
        Pattern p = Pattern.compile("\\-");
        boolean replaceAll = Boolean.TRUE;
        tokenStream = new PatternReplaceFilter(tokenStream, p, "", replaceAll);
        return new TokenStreamComponents(source, tokenStream);
    }  
}

它使用PatternReplaceFilter在空格上拆分,然后删除连字符,其工作方式如下所示(我使用和作为分隔符来显示空格可能是输入/输出的一部分):

Input text:
「doc-size type」

Output tokens:
「docsize」
「type」

注意-这将删除 * 所有 * 标准键盘 * 连字符-但不包括长破折号、短破折号等。它将删除这些标准连字符,而不管它们出现在文本中的什么位置(单词开头、单词结尾、单独等等)。

一组标点符号

您可以根据需要更改图案以覆盖更多标点符号,例如:

Pattern p = Pattern.compile("[$^-]");

这将执行以下操作:

Input text:
「doc-size type $foo^bar」

Output tokens:
「docsize」
「type」
「foobar」

所有非字符或数字的内容
您可以使用以下命令删除所有非字符或数字的内容:

Pattern p = Pattern.compile("[^A-Za-z0-9]");

这将执行以下操作:

Input text:
「doc-size 123 %^&*{} type $foo^bar」

Output tokens:
「docsize」
「123」
「」
「type」
「foobar」

请注意,在结果标记中有一个空字符串。
警告:上述方法是否适用,主要取决于您的具体要求。例如,您可能需要执行额外的转换来处理大小写差异-即在索引文本时通常需要考虑的常见问题。

关于标准分析仪的注意事项

StandardAnalyzer实际上 * 确实 * 删除了单词中的连字符(有一些模糊的例外)。在你的问题中,你提到它没有删除它们。标准分析器使用标准的标记器。标准标记器实现了Unicode文本分割算法中的断字规则,如这里所指定的。有一节讨论了如何处理单词中的连字符。
因此,标准分析器将执行以下操作:

Input text:
「doc-size type」

Output tokens:
「doc」
「size」
「type」

这应该适用于docdoctype的搜索--问题只是它是否能满足您的需要。
我知道这可能不是您想要的。但是如果您可以避免需要构建自定义分析器,那么生活可能会简单得多。

相关问题