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

Filter 有没有办法使用Lucene过滤器删除所有特殊字符?,filter,lucene,special-characters,analyzer,Filter,Lucene,Special Characters,Analyzer,标准分析器删除特殊字符,但不是所有字符,例如:“-”。我只想用字母数字字符索引字符串,但要引用原始文档 示例:“文档大小类型”应索引为“docsize”和“type”,两者都应指向原始文档:“doc size type”这取决于特殊字符的含义,以及您可能有哪些其他要求。但是下面的内容可能会给你所需要的,或者为你指明正确的方向 以下示例均假定Lucene版本为8.4.1 基本示例 从您给出的非常具体的示例开始,其中doc size type应被索引为docsize和type,下面是一个自定义分析器

标准分析器删除特殊字符,但不是所有字符,例如:“-”。我只想用字母数字字符索引字符串,但要引用原始文档


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

这取决于特殊字符的含义,以及您可能有哪些其他要求。但是下面的内容可能会给你所需要的,或者为你指明正确的方向

以下示例均假定Lucene版本为8.4.1

基本示例 从您给出的非常具体的示例开始,其中doc size type应被索引为docsize和type,下面是一个自定义分析器:

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」
注意-这将删除所有标准键盘连字符,但不会删除em破折号、en破折号等。它将删除这些标准连字符,而不管它们在文本中出现在什么位置,单词的开头、结尾,等等

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

Pattern p = Pattern.compile("[$^-]");
这样做的目的如下:

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

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

Output tokens:
「docsize」
「123」
「」
「type」
「foobar」
不是字符或数字的一切 您可以使用以下命令删除所有非字符或数字的内容:

Pattern p = Pattern.compile("[^A-Za-z0-9]");
这样做的目的如下:

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

Output tokens:
「docsize」
「type」
「foobar」
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」
这应该适用于搜索doc和doctype——问题在于它是否能满足您的需要


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

对于特殊字符,我指的是任何不是字符或数字的东西。这看起来像是我要找的。我会试一试的。如果它符合我的要求,你就是一个救生员。