Analyzers
StandardTokenizer
将文本分割为 token,空白符和标点被作为分隔符丢弃,但有如下例外
句点后面跟着的不是空白符,会作为 token 的一部分保留,包括互联网域名
@ 也视同为标点(也即会作为分隔符被丢弃),所以电子邮件地址不会作为一个 token 保留
工厂类
solr.StandardTokenizerFactory
参数
maxTokenLength:如果组成 token 的字符超过这个数字会被忽略,默认=255
示例
输入
"Please, email john.doe@foo.com by 03-09, re: m37-xq."
输出
"Please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"
ClassicTokenizer
在 solr 3.1 和之前版本,与 StandardTokenizer 一样
将文本分割为 token,空白符和标点作为分隔符被丢弃,但有如下例外
句点后面跟着的不是空白符,则会作为 token 的一部分被保留
如果用连字符(-)连接的词中有数字,则连字符不会被当作分隔符;否则连字符或被视同分隔符
识别域名和电子邮件地址,将其作为单个 token 保留
工厂类
solr.ClassicTokenizerFactory
参数
maxTokenLength:如果组成 token 的字符超过这个数字会被忽略,默认=255
示例
输入
"Please, email john.doe@foo.com by 03-09, re: m37-xq."
输出
"Please", "email", "john.doe@foo.com", "by", "03-09", "re", "m37-xq"
KeywordTokenizer
将整个文本当作一个 token
工厂类
solr.KeywordTokenizerFactory
示例
输入
"Please, email john.doe@foo.com by 03-09, re: m37-xq."
输出
"Please, email john.doe@foo.com by 03-09, re: m37-xq."
LetterTokenizer
连续的字符作为 token,非字符全部丢弃
工厂类
solr.LetterTokenizerFactory
示例
输入
"I can't."
输出
"I", "can", "t"
LowerCaseTokenizer
非字符作为分隔符,大写转换为小写,空白符和非字符全部丢弃
工厂类
solr.LowerCaseTokenizerFactory
示例
输入
"I just LOVE my iPhone!"
输出
"i", "just", "love", "my", "iphone"
N-GramTokenizer
使用 n-gram 模型来分词
工厂类
solr.NGramTokenizerFactory
参数
minGramSize: 步长的最小值,必须大于 0,默认=1
maxGramSize: 步长的最大值,必须大于等于 minGramSize,默认=2
示例
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory"/>
</analyzer>
输入
"hey man"
输出
"h", "e", "y", " ", "m", "a", "n", "he", "ey", "y ", " m", "ma", "an"
示例2
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="4" maxGramSize="5"/>
</analyzer>
输入
"bicycle"
输出
"bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"
EdgeN-GramTokenizer
和 n-gram 类似,区别是只能从输入的边缘进行分词,且支持从头和尾进行分词
工厂类
solr.EdgeNGramTokenizerFactory
参数
minGramSize: 步长的最小值,必须大于 0,默认=1
maxGramSize: 步长的最大值,必须大于等于 minGramSize,默认=1
side: 是从头还是从尾开始分词,取值为 [front, back],默认=front
示例
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory"/>
</analyzer>
输入
"babaloo"
输出
"b"
示例2
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="5"/>
</analyzer>
输入
"babaloo"
输出
"ba", "bab", "baba", "babal"
示例3
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="5"
side="back"/>
</analyzer>
输入
"babaloo"
输出
"oo", "loo", "aloo", "baloo"
ICUTokenizer
多语言分词器,需要指定各语言的规则文件
工厂类
solr.ICUTokenizerFactory
参数
rulefile: 指定了语言编码及其规则文件,如果有多个语言需要支持,则用逗号分隔。语言编码是 4字符的,根据 ISO 15924 规范
示例
<analyzer>
<tokenizer class="solr.ICUTokenizerFactory"
rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>
PathHierarchyTokenizer
目录层级进行分词
工厂类
solr.PathHierarchyTokenizerFactory
参数
delimiter: 目录分隔符
replace: 在输出的 token 里用这个代替输入文本里的目录分隔符
示例
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="\" replace="/"/>
</analyzer>
</fieldType>
输入
"c:\usr\local\apache"
输出
"c:", "c:/usr", "c:/usr/local", "c:/usr/local/apache"
RegularExpressionPatternTokenizer
用 java 的正则表达式来分词
工厂类
solr.PatternTokenizerFactory
参数
pattern: 必须,java 正则表达式
group: 指定哪个 group 被抽取为 token,默认=-1
group=-1:正则表达式作为分隔符来分词
group=0:以匹配的 group(0) 作为 token,全部匹配(?)
group>0:以匹配的 group(1)...group(n) 作为 token
示例
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
</analyzer>
输入
"fee,fie, foe , fum, foo"
输出
"fee", "fie", "foe", "fum", "foo"
示例2
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="[A-Z][A-Za-z]*" group="0"/>
</analyzer>
输入
"Hello. My name is Inigo Montoya. You killed my father. Prepare to die."
输出
"Hello", "My", "Inigo", "Montoya", "You", "Prepare"
示例3
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory"
pattern="(SKU|Part(\sNumber)?):?\s(\[0-9-\]+)" group="3"/>
</analyzer>
输入
"SKU: 1234, Part Number 5678, Part: 126-987"
输出
"1234", "5678", "126-987"
UAX29URLEmailTokenizer
将文本分割为 token,空白符和标点作为分隔符被丢弃,但有如下例外
句点后面跟着的不是空白符,则会作为 token 的一部分被保留
如果用连字符(-)连接的词中有数字,则连字符不会被当作分隔符;否则连字符或被视同分隔符
识别下列情况,并作为单个 token 保留
互联网域名
电子邮件地址
file://, http(s)://, ftp://
IPv4 and IPv6 地址
工厂类
solr.UAX29URLEmailTokenizerFactory
参数
maxTokenLength:如果组成 token 的字符超过这个数字会被忽略,默认=255
示例
输入
"Visit http://accarol.com/contact.htm?from=external&a=10 or e-mail bob.cratchet@accarol.com"
输出
"Visit", "http://accarol.com/contact.htm?from=external&a=10", "or", "e", "mail", "bob.cratchet@accarol.com"
WhiteSpaceTokenizer
用空白符作为分隔符进行分词,标点符号也作为 token 的一部分保留
工厂类
solr.WhitespaceTokenizerFactory
参数
rule:如何定义空白符
java: 默认,Character.isWhitespace(int)
unicode: 使用 Unicode 的空白符属性
示例
输入
"To be, or what?"
输出
"To", "be,", "or", "what?"
Last updated