标准分析器会删除特殊字符,但不是全部(例如:'-')。我希望仅使用字母数字字符对字符串进行索引,但要引用原始文档。范例:'doc-size type'的索引应该是'docsize'和'type',而且两者都应该指向原始文件:'文档大小类型'
gdx19jrr1#
这取决于你所说的“特殊字符”是什么意思,以及你可能有什么其他的要求。但是下面的内容可能会给予你你所需要的,或者给你指出正确的方向。以下示例均假定Lucene版本为8.4.1。
从您给出的非常具体的例子开始,其中doc-size type应该被索引为docsize和type,下面是一个定制的分析器:
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在空格上拆分,然后删除连字符,其工作方式如下所示(我使用和作为分隔符来显示空格可能是输入/输出的一部分):
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文本分割算法中的断字规则,如这里所指定的。有一节讨论了如何处理单词中的连字符。因此,标准分析器将执行以下操作:
StandardAnalyzer
Input text: 「doc-size type」 Output tokens: 「doc」 「size」 「type」
这应该适用于doc和doctype的搜索--问题只是它是否能满足您的需要。我知道这可能不是您想要的。但是如果您可以避免需要构建自定义分析器,那么生活可能会简单得多。
doc
doctype
1条答案
按热度按时间gdx19jrr1#
这取决于你所说的“特殊字符”是什么意思,以及你可能有什么其他的要求。但是下面的内容可能会给予你你所需要的,或者给你指出正确的方向。
以下示例均假定Lucene版本为8.4.1。
基本示例
从您给出的非常具体的例子开始,其中
doc-size type
应该被索引为docsize
和type
,下面是一个定制的分析器:它使用
PatternReplaceFilter
在空格上拆分,然后删除连字符,其工作方式如下所示(我使用和作为分隔符来显示空格可能是输入/输出的一部分):注意-这将删除 * 所有 * 标准键盘 * 连字符-但不包括长破折号、短破折号等。它将删除这些标准连字符,而不管它们出现在文本中的什么位置(单词开头、单词结尾、单独等等)。
一组标点符号
您可以根据需要更改图案以覆盖更多标点符号,例如:
这将执行以下操作:
所有非字符或数字的内容
您可以使用以下命令删除所有非字符或数字的内容:
这将执行以下操作:
请注意,在结果标记中有一个空字符串。
警告:上述方法是否适用,主要取决于您的具体要求。例如,您可能需要执行额外的转换来处理大小写差异-即在索引文本时通常需要考虑的常见问题。
关于标准分析仪的注意事项
StandardAnalyzer
实际上 * 确实 * 删除了单词中的连字符(有一些模糊的例外)。在你的问题中,你提到它没有删除它们。标准分析器使用标准的标记器。标准标记器实现了Unicode文本分割算法中的断字规则,如这里所指定的。有一节讨论了如何处理单词中的连字符。因此,标准分析器将执行以下操作:
这应该适用于
doc
和doctype
的搜索--问题只是它是否能满足您的需要。我知道这可能不是您想要的。但是如果您可以避免需要构建自定义分析器,那么生活可能会简单得多。