Solr中有哪些Tokenizers
Tokenizer 负责将字段数据分解为词法单位或标记。
本节将介绍以下的 Tokenizer:
- 标准 Tokenizer
- 经典 Tokenizer
- 关键字 Tokenizer
- 信令 Tokenizer
- 小写 Tokenizer
- N-gram Tokenizer
- 边缘 N-gram Tokenizer
- ICU Tokenizer
- 路径层次 Tokenizer
- 正则表达式模式 Tokenizer
- 简化的正则表达式模式 Tokenizer
- 简化的正则表达式模式分割 Tokenizer
- UAX29 URL 电子邮件 Tokenizer
- 白空间 Tokenizer
您可以在 schema.xml 中使用 <tokenizer> 元素(作为 <analyzer> 的子级)将文本字段类型的 tokenizer 配置:
<fieldType name="text" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
</analyzer>
</fieldType>
类属性命名一个工厂类,它将在需要时实例化一个 tokenizer 对象。Tokenizer 工厂类实现 org.apache.solr.analysis.TokenizerFactory。TokenizerFactory 的create() 方法接受一个 Reader 并返回一个 TokenStream。当 Solr 创建 tokenizer 时,它传递一个 Reader 对象来提供文本字段的内容。
通过设置 <tokenizer> 元素的属性,可以将参数传递给 tokenizer 工厂。
<fieldType name="semicolonDelimited" class="solr.TextField">
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="; "/>
</analyzer>
</fieldType>
以下各节介绍此版本 Solr 中包含的 tokenizer 工厂类。
有关 Solr 的 tokenizers 的用户提示,请参阅:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters。
标准 Tokenizer
该 tokenizer 将文本字段分割为标记,将空格和标点符号作为分隔符。分隔符字符被丢弃,但以下情况除外:
- 不后跟空格的句点 (点) 作为标记的一部分保留,包括因特网域名。
- “@”字符是标记拆分标点符号集合,因此电子邮件地址不会保留为单个标记。
请注意,单词是以连字符分隔的。
标准分词器支持 Unicode 标准附件 UAX#29 字边界,并且使用下列标记类型:<ALPHANUM>、<NUM>、<SOUTHEAST_ASIAN>、<IDEOGRAPHIC> 和<HIRAGANA>。
工厂类: solr.StandardTokenizerFactory
参数:
maxTokenLength:(整数,默认值为255)Solr 忽略超过由 maxTokenLength 指定的字符数的标记。
例如:
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
输入: "Please, email john.doe@foo.com by 03-09, re: m37-xq."
输出: "Please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"
经典 Tokenizer
经典 Tokenizer 保留与 Solr 版本3.1和之前的标准 Tokenizer 相同的行为。它不使用标准 Tokenizer 使用的 Unicode 标准附录 UAX#29 字边界规则。该 tokenizer将文本字段分割为标记,将空格和标点符号作为分隔符。分隔符字符被丢弃,但以下情况除外:
- 没有被空白的时间段(点)被保存为令牌的一部分。
- 除非在单词中有一个数字,否则单词将被拆分为连字符,在这种情况下,令牌不会被拆分,数字和连字符将被保留。
- 识别 Internet 域名和电子邮件地址, 并将其保留为单个标记。
工厂类: solr.ClassicTokenizerFactory
参数:
maxTokenLength:(整数,默认值为 255)Solr 忽略超过由 maxTokenLength 指定的字符数的标记。
例如:
<analyzer>
<tokenizer class="solr.ClassicTokenizerFactory"/>
</analyzer>
输出:"Please, email john.doe@foo.com by 03-09, re: m37-xq."
输入:"Please", "email", "john.doe@foo.com", "by", "03-09", "re", "m37-xq"
关键字 Tokenizer
这个 tokenizer 将整个文本字段视为单个标记。
工厂类: solr.KeywordTokenizerFactory
参数:无
示例:
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
输入:"Please, email john.doe@foo.com by 03-09, re: m37-xq."
输出: "Please, email john.doe@foo.com by 03-09, re: m37-xq."
信令 Tokenizer
该 tokenizer 从连续字母串创建标记,丢弃所有非字母字符。
工厂类: solr.LetterTokenizerFactory
参数:无
示例:
<analyzer>
<tokenizer class="solr.LetterTokenizerFactory"/>
</analyzer>
输入: "I can’t."
输出:"I", "can", "t"
小写 Tokenizer
通过以非字母分隔的方式标记输入流,然后将所有字母转换为小写。空白和非字母被丢弃。
工厂类: solr.LowerCaseTokenizerFactory
参数:无
示例:
<analyzer>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
输入: "I just *LOVE* my iPhone!"
输出: "i", "just", "love", "my", "iphone"
N-gram Tokenizer
读取字段文本并在给定范围内生成大小为 n-gram 的记号。
工厂类: solr.NGramTokenizerFactory
参数:
minGramSize:(整数,默认1)最小 n-gram 大小,必须> 0。
maxGramSize:(整数,默认2)最大 n-gram 大小,必须> = minGramSize。
示例:
默认行为。请注意,这个 tokenizer 操作整个领域。它不会在空格处破坏字段。因此,空格字符被包括在编码中。
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory"/>
</analyzer>
输入:"hey man"
输出:"h", "e", "y", " ", "m", "a", "n", "he", "ey", "y ", " m", "ma", "an"
示例:
n-gram 大小范围为4到5:
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="4" maxGramSize="5"/>
</analyzer>
输入:"bicycle"
输出:"bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"
边缘 N-gram Tokenizer
读取字段文本并在给定范围内生成大小的边缘 n-gram 标记。
工厂类: solr.EdgeNGramTokenizerFactory
参数:
minGramSize:(整数,默认值为1)最小 n-gram 大小,必须> 0。
maxGramSize:(整数,默认值为1)最大 n-gram 大小,必须> = minGramSize。
side:("front" 或 "back",默认为"front")是否从文本的开头 (front) 或从末尾 (back) 计算 n-gram。
示例:
默认行为(最小值和最大值默认为1):
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory"/>
</analyzer>
输入: “babaloo”
输出: “b”
示例:
边缘 n-gram 范围为2到5
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="5"/>
</analyzer>
输入: “babaloo”
输出: “ba”,“bab”,“baba”,“babal”
示例:
边缘 n-gram 范围从2到5,从背面:
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="5" side="back"/>
</analyzer>
输入: “babaloo”
输出: “oo”,“loo”,“aloo”,“baloo”
ICU Tokenizer
这个 tokenizer 处理多语言文本,并根据其脚本属性对其进行标记。
您可以通过指定每个脚本规则文件来自定义此标记器的行为。要添加每个脚本规则,请添加一个 rulefiles 参数,该参数应包含以下格式的 code:rulefile 对的逗号分隔列表对象:四个字母的 ISO 15924 脚本代码,后跟一个冒号,然后是一个资源路径。例如,要指定 Latin(脚本代码 “Latn”)和 Cyrillic(脚本代码 “Cyrl”)的规则,您可以输入:Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi。
solr.ICUTokenizerFactory 的默认配置提供了 UAX#29 的分词规则标记(如 solr.StandardTokenizer),但也包括自定义定制为 Hebrew(专门处理双引号和单引号),为 Khmer,Lao 和 Myanmar 的音节标记,并对CJK字符进行基于字典的分词。
工厂类: solr.ICUTokenizerFactory
参数:
rulefile:以下格式的 code:rulefile 对的逗号分隔列表对象:四个字母的 ISO 15924 脚本代码,后跟一个冒号,然后是一个资源路径。
示例:
<analyzer>
<!-- no customization -->
<tokenizer class="solr.ICUTokenizerFactory"/>
</analyzer>
<analyzer>
<tokenizer class="solr.ICUTokenizerFactory"
rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>
要使用此 tokenizer,您必须将其他 . jar 添加到 Solr 的类路径中 (如 SolrConfig 中的 Lib 指令中所述)。有关需要添加到您的 SOLR_HOME/lib 的 jar 的信息,请参见 solr/contrib/analysis-extras/README.txt。
路径层次 Tokenizer
这个 tokenizer 从文件路径层次结构中创建同义词。
工厂类: solr.PathHierarchyTokenizerFactory
参数:
delimiter:(字符,无默认值)您可以指定文件路径分隔符并将其替换为您提供的分隔符。这对于使用反斜线分隔符是非常有用的。
replace:(字符,无默认值)指定 Solr 在标记化输出中使用的分隔符。
示例:
<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”
正则表达式模式 Tokenizer
该 tokenizer 使用 Java 正则表达式将输入文本流分解为标记。由 pattern 参数提供的表达式可以被解释为分隔符,或者匹配应该从文本中提取的作为记号的模式。
有关 Java 正则表达式语法的更多信息,请参阅 Javadocsjava.util.regex.Pattern。
工厂类: solr.PatternTokenizerFactory
参数:
pattern:(必需的)正则表达式,如 java.util.regex.Pattern 中所定义。
group:(可选,默认为-1)指定要将哪个正则表达式组提取为标记。值-1意味着正则表达式应被视为分隔符的分隔符。非负数组(> = 0)表示匹配该正则表达式组的字符序列应转换为令牌。组0指整个正则表达式,大于零的组引用正则表达式的带括号的子表达式,从左到右计数。
示例:
用逗号分隔的列表。令牌由一系列零个或多个空格,一个逗号和零个或多个空格分隔。
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
</analyzer>
输入:"fee,fie, foe , fum, foo"
输出:"fee", "fie", "foe", "fum", "foo"
示例:
提取简单的大写单词。至少一个大写字母后跟零个或多个字母的序列被提取为一个标记。
<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"
示例:
使用可选的分号分隔符提取以 “SKU”、“Part”或 “Part Number” 开头的零件号码,区分大小写。部件号必须是全部数字,并带有可选的连字符。正则表达式捕获组通过从左到右计算左括号进行编号。组3是子表达式“[0-9 - ] +”,它匹配一个或多个数字或连字符。
<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"
简化的正则表达式模式 Tokenizer
这个 tokenizer 类似于上面描述的 PatternTokenizerFactory,但是使用 Lucene RegExp 模式匹配为输入流构造不同的标记。语法比 PatternTokenizerFactory 限制更多,但是标记化速度要快得多。
工厂类: solr.SimplePatternTokenizerFactory
参数:
pattern:(必需)在 RegExpjavadoc 中定义的正则表达式,标识要包含在标记中的字符。这个匹配是贪婪的,这样就可以创建一个给定点上最长的令牌匹配。空令牌永远不会被创建。
maxDeterminizedStates:(可选,默认为10000)由 regexp 计算的确定自动机的总状态计数限制。
示例:
匹配由简单的空格字符分隔的令牌:
<analyzer>
<tokenizer class="solr.SimplePatternTokenizerFactory" pattern="[^ \t\r\n]+"/>
</analyzer>
简化的正则表达式模式分割 Tokenizer
这个 tokenizer 类似于上面描述的 SimplePatternTokenizerFactory,但是使用 Lucene RegExp 模式匹配来标识应该用于分割标记的字符序列。语法比 PatternTokenizerFactory 限制更多,但是标记化速度要快得多。
工厂类: solr.SimplePatternSplitTokenizerFactory
参数:
pattern:(必需)在 RegExpjavadocs 中定义的正则表达式,标识应该分割记号的字符。该匹配是贪婪的,使得在给定点匹配最长的令牌分隔符匹配。空令牌永远不会被创建。
maxDeterminizedStates:(可选,默认为10000)由 regexp 计算的确定自动机的总状态计数限制。
示例:
匹配由简单的空格字符分隔的令牌:
<analyzer>
<tokenizer class="solr.SimplePatternSplitTokenizerFactory" pattern="[ \t\r\n]+"/>
</analyzer>
UAX29 URL 电子邮件 Tokenizer
该 tokenizer 将文本字段分割为标记,将空格和标点符号作为分隔符。分隔符字符被丢弃,但以下情况除外:
- 未后跟空格的句点 (点) 作为标记的一部分保留。
- 除非在单词中有一个数字,否则单词将被拆分为连字符,在这种情况下,令牌不会被拆分,数字和连字符将被保留。
- 识别并保留为单个标记如下:包含顶级域名的互联网域名在生成分词器时根据 IANA 根区数据库中的白名单进行验证电子邮件地址:file://、http(s):// 和 ftp:// URLs,IPv4 和 IPv6 地址
该 UAX29 URL 的电子邮件标记生成器支持 Unicode 标准附件 UAX#29 字边界与以下标记类型:<ALPHANUM>、<NUM>、<URL>、<EMAIL>、<SOUTHEAST_ASIAN>、<IDEOGRAPHIC> 和 <HIRAGANA>。
工厂类: solr.UAX29URLEmailTokenizerFactory
参数:
maxTokenLength:(整数,默认值为255)Solr 忽略超过由 maxTokenLength 指定的字符数的标记。
示例:
<analyzer>
<tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
</analyzer>
输入:"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"
白空间 Tokenizer
简单的 tokenizer,将文本流分割成空白字符,并返回非空白字符序列作为标记。请注意,标记中将包含任何标点符号。
工厂类: solr.WhitespaceTokenizerFactory
参数:: rule 指定如何为标记化目的定义空白。有效值如下:
- java:(默认)使用 Character.isWhitespace(int)
- unicode:使用 Unicode 的 WHITESPACE 属性
示例:
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory" rule="java" />
</analyzer>
输入:"To be, or what?"
输出:"To", "be,", "or", "what?"