是否可以使用Lucene过滤器删除所有特殊字符?

问题描述 投票:0回答:1

标准分析器会删除特殊字符,但不会全部删除(例如:'-')。我想只用字母数字字符来索引我的字符串,但要引用原始文档。

示例:“ doc-size类型”应被索引为“ docsize”和“ type”,并且两者都应指向原始文档:“ doc-size类型”

filter lucene special-characters analyzer
1个回答
0
投票

这取决于您所说的“特殊字符”,以及您可能还有其他要求。但是以下内容可能会为您提供所需的信息,或为您指明正确的方向。

以下示例均假定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」

注意-这将删除all连字符,这些字符是标准键盘连字符-但不能删除破折号,破折号等。无论它们在文本中的什么位置(单词开头,单词结尾,单独出现,等等),它将删除这些标准连字符。

一组标点符号

您可以根据需要更改模式以覆盖更多的标点符号-例如:

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实际上does删除单词中的连字符(有一些晦涩的例外)。在您的问题中,您提到它不会删除它们。标准分析器使用标准标记器。并且,标准的分词器按照here的规定从Unicode文本分段算法中实现分词规则。有一节讨论如何处理单词中的连字符。

因此,标准分析仪将执行此操作:

Input text:
「doc-size type」

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

这既适用于搜索doc,也适用于doctype-这只是一个问题,即它是否足以满足您的需求。

我知道那可能不是您想要的。但是,如果您可以避免构建自定义分析器,那么生活可能会简单得多。

© www.soinside.com 2019 - 2024. All rights reserved.