标准分析器会删除特殊字符,但不会全部删除(例如:'-')。我想只用字母数字字符来索引我的字符串,但要引用原始文档。
示例:“ doc-size类型”应被索引为“ docsize”和“ type”,并且两者都应指向原始文档:“ doc-size类型”
这取决于您所说的“特殊字符”,以及您可能还有其他要求。但是以下内容可能会为您提供所需的信息,或为您指明正确的方向。
以下示例均假定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」
注意-这将删除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
-这只是一个问题,即它是否足以满足您的需求。
我知道那可能不是您想要的。但是,如果您可以避免构建自定义分析器,那么生活可能会简单得多。