分词器

分词器负责将字段数据分解为词汇单位或标记

每个标记(通常)是文本中字符的子序列。分析器了解其配置的字段,但分词器不了解。分词器从字符流(Reader)读取并生成一系列标记对象(TokenStream)。

输入流中的空格或其他分隔符等字符可能会被丢弃。它们还可以被添加到或替换,例如将别名或缩写映射到规范化形式。

除了文本值之外,标记还包含各种元数据,例如标记在字段中出现的位置。由于分词器可能会生成与输入文本不同的标记,因此你不应假设标记的文本与字段中出现的文本相同,或者其长度与原始文本相同。多个标记也可能具有相同的位置或引用原始文本中的相同偏移量。如果你将标记元数据用于诸如在字段文本中突出显示搜索结果之类的操作,请记住这一点。

关于分词器

你可以在 架构 中使用 <tokenizer> 元素(作为 <analyzer> 的子元素)为文本字段类型配置分词器

带名称

<fieldType name="text" class="solr.TextField">
  <analyzer type="index">
    <tokenizer name="standard"/>
    <filter name="lowercase"/>
  </analyzer>
</fieldType>

带类名(旧版)

<fieldType name="text" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

name/class 属性名称指定一个工厂类,该类将在需要时实例化一个标记器对象。标记器工厂类实现 org.apache.lucene.analysis.TokenizerFactory。TokenizerFactory 的 create() 方法接受一个 Reader 并返回一个 TokenStream。当 Solr 创建标记器时,它会传递一个提供文本字段内容的 Reader 对象。

可以通过在 <tokenizer> 元素上设置属性来将参数传递给标记器工厂。

带名称

<fieldType name="semicolonDelimited" class="solr.TextField">
  <analyzer type="query">
    <tokenizer name="pattern" pattern="; "/>
  </analyzer>
</fieldType>

带类名(旧版)

<fieldType name="semicolonDelimited" class="solr.TextField">
  <analyzer type="query">
    <tokenizer class="solr.PatternTokenizerFactory" pattern="; "/>
  </analyzer>
</fieldType>

何时使用 CharFilter 与 TokenFilter

有几对 CharFilter 和 TokenFilter 具有相关(即 MappingCharFilterASCIIFoldingFilter)或几乎相同(即 PatternReplaceCharFilterFactoryPatternReplaceFilterFactory)的功能,并且并不总是很明显哪种是最佳选择。

关于使用哪种的决定在很大程度上取决于您正在使用的 Tokenizer,以及您是否需要预处理字符流。

例如,假设您有一个标记器,例如 StandardTokenizer,尽管您对它的整体工作方式很满意,但您希望自定义某些特定字符的行为。您可以修改规则并使用 JFlex 重新构建自己的标记器,但使用 CharFilter 在标记化之前简单地映射一些字符可能会更容易。

以下部分描述了此 Solr 版本中包含的标记器工厂类。

标准标记器

此标记器将文本字段拆分为标记,将空格和标点符号视为分隔符。分隔符字符将被丢弃,但以下情况除外

  • 后面没有空格的句号(点)将作为标记的一部分保留,包括互联网域名。

  • “@”字符属于标记拆分标点符号,因此电子邮件地址不会保留为单个标记。

请注意,单词在连字符处拆分。

标准标记器支持 Unicode 标准附件 UAX#29 单词边界,具有以下标记类型:<ALPHANUM><NUM><SOUTHEAST_ASIAN><IDEOGRAPHIC><HIRAGANA>

工厂类: solr.StandardTokenizerFactory

参数

maxTokenLength

可选

默认值:255

Solr 忽略超出 maxTokenLength 指定的字符数的标记。

示例

带名称

<analyzer>
  <tokenizer name="standard"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>

输入: “请通过 03-09 发送电子邮件 [email protected],主题:m37-xq。”

输出: “请”、“电子邮件”、“john.doe”、“foo.com”、“通过”、“03”、“09”、“主题”、“m37”、“xq”

经典标记器

经典分词器保留了 Solr 3.1 及更早版本标准分词器的相同行为。它不使用标准分词器使用的Unicode 标准附件 UAX#29单词边界规则。此分词器将文本字段拆分为标记,将空白和标点符号视为分隔符。分隔符字符将被丢弃,但以下情况除外

  • 不后跟空白的句点(点)作为标记的一部分保留。

  • 单词在连字符处拆分,除非单词中包含数字,在这种情况下,标记不会拆分,数字和连字符将被保留。

  • 识别互联网域名和电子邮件地址,并将其保留为单个标记。

工厂类:solr.ClassicTokenizerFactory

参数

maxTokenLength

可选

默认值:255

Solr 忽略超出 maxTokenLength 指定的字符数的标记。

示例

带名称

<analyzer>
  <tokenizer name="classic"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.ClassicTokenizerFactory"/>
</analyzer>

输入: “请通过 03-09 发送电子邮件 [email protected],主题:m37-xq。”

输出:“Please”、“email”、“[email protected]”、“by”、“03-09”、“re”、“m37-xq”

关键字分词器

此分词器将整个文本字段视为单个标记。

工厂类:solr.KeywordTokenizerFactory

参数

maxTokenLen

可选

默认值:256

分词器将发出的最大标记长度。

示例

带名称

<analyzer>
  <tokenizer name="keyword"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>

输入: “请通过 03-09 发送电子邮件 [email protected],主题:m37-xq。”

输出:“Please, email [email protected] by 03-09, re: m37-xq.”

字母分词器

此分词器从连续字母的字符串创建标记,丢弃所有非字母字符。

工厂类:solr.LetterTokenizerFactory

参数

maxTokenLen

可选

默认值:255

分词器将发出的最大标记长度。

示例

带名称

<analyzer>
  <tokenizer name="letter"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.LetterTokenizerFactory"/>
</analyzer>

输入:“I can’t.”

输出:“I”、“can”、“t”

小写分词器

通过在非字母处分隔,然后将所有字母转换为小写,对输入流进行分词。空白和非字母将被丢弃。

工厂类:solr.LowerCaseTokenizerFactory

参数

maxTokenLen

可选

默认值:255

分词器将发出的最大标记长度。

示例

带名称

<analyzer>
  <tokenizer name="lowercase"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>

输入:“I just *LOVE* my iPhone!”

输出:“i”、“just”、“love”、“my”、“iphone”

N-Gram 分词器

读取字段文本并生成给定范围内的 n-gram 标记。

工厂类:solr.NGramTokenizerFactory

参数

minGramSize

可选

默认值:1

最小 n-gram 大小,必须 > 0。

maxGramSize

可选

默认值:2

最大 n-gram 大小,必须 >= minGramSize

示例

默认行为。请注意,此分词器在整个字段上运行。它不会在空白处拆分字段。因此,空格字符包含在编码中。

带名称

<analyzer>
  <tokenizer name="nGram"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.NGramTokenizerFactory"/>
</analyzer>

输入:“hey man”

输出:“h”、“e”、“y”、“”、“m”、“a”、“n”、“he”、“ey”、“y”、“m”、“ma”、“an”

示例

N 元组大小范围为 4 到 5

带名称

<analyzer>
  <tokenizer name="nGram" minGramSize="4" maxGramSize="5"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.NGramTokenizerFactory" minGramSize="4" maxGramSize="5"/>
</analyzer>

输入:“bicycle”

输出:“bicy”、“bicyc”、“icyc”、“icycl”、“cycl”、“cycle”、“ycle”

边缘 N 元组标记器

读取字段文本并生成指定范围大小的边缘 N 元组标记。

工厂类:solr.EdgeNGramTokenizerFactory

参数

minGramSize

可选

默认值:1

最小 n-gram 大小,必须 > 0。

maxGramSize

可选

默认值:1

最大 n-gram 大小,必须 >= minGramSize

示例

默认行为(最小值和最大值默认为 1)

带名称

<analyzer>
  <tokenizer name="edgeNGram"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.EdgeNGramTokenizerFactory"/>
</analyzer>

输入:“babaloo”

输出:“b”

示例

边缘 N 元组范围为 2 到 5

带名称

<analyzer>
  <tokenizer name="edgeNGram" minGramSize="2" maxGramSize="5"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="5"/>
</analyzer>

输入:“babaloo”

输出:“ba”、“bab”、“baba”、“babal”

ICU 标记器

此标记器处理多语言文本,并根据其脚本属性对其进行适当标记。

您可以通过指定每个脚本规则文件来自定义此标记器的行为。要添加每个脚本规则,请添加一个 rulefiles 参数,其中应包含以下格式的 code:rulefile 对的逗号分隔列表:四字母 ISO 15924 脚本代码,后跟冒号,然后是资源路径。例如,要为拉丁语(脚本代码“Latn”)和西里尔语(脚本代码“Cyrl”)指定规则,您需要输入 Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi

solr.ICUTokenizerFactory 的默认配置提供了 UAX#29 词语切分规则标记(如 solr.StandardTokenizer),但还包括针对希伯来语的自定义调整(专门处理双引号和单引号)、针对高棉语、老挝语和缅甸语的音节标记以及针对 CJK 字符的基于词典的词语分词。

工厂类:solr.ICUTokenizerFactory

参数

rulefile

可选

默认值:无

以下格式的 code:rulefile 对的逗号分隔列表:四字母 ISO 15924 脚本代码,后跟冒号,然后是资源路径。

cjkAsWords

可选

默认值:true

如果为 true,CJK 文本将进行基于词典的分词,所有汉字+平假名+片假名词语都将标记为表意文字。否则,文本将根据 UAX#29 默认值进行分词。

myanmarAsWords

可选

默认值:true

如果为 true,缅甸语文本将进行基于词典的分词,否则将标记为音节。

示例

带名称

<analyzer>
  <!-- no customization -->
  <tokenizer name="icu"/>
</analyzer>

带类名(旧版)

<analyzer>
  <!-- no customization -->
  <tokenizer class="solr.ICUTokenizerFactory"/>
</analyzer>

带名称

<analyzer>
  <tokenizer name="icu"
             rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.ICUTokenizerFactory"
             rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>

要使用此标记器,您必须向 Solr 的类路径添加其他 .jar(如安装插件部分中所述)。有关需要添加哪些 jar 的信息,请参阅 solr/modules/analysis-extras/README.md

路径层次结构标记器

此标记器从文件路径层次结构创建同义词。

工厂类:solr.PathHierarchyTokenizerFactory

参数

delimiter

必需

默认值:无

您可以指定文件路径分隔符,并用您提供的分隔符替换它。这对于处理反斜杠分隔符非常有用。

replace

必需

默认值:无

指定 Solr 在标记化输出中使用的分隔符字符。

reverse

可选

默认值:false

如果为 true,则切换标记化行为以按“反向”顺序构建路径层次结构。这通常对于标记化 URL 很有用。

skip

可选

默认值:0

从每个发出的标记中删除的最左边的(或最右边的,如果 reverse=true)路径元素数。

示例

默认行为

带名称

<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer name="pathHierarchy" delimiter="\" replace="/"/>
  </analyzer>
</fieldType>

带类名(旧版)

<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"

示例

反向顺序

带名称

<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer name="pathHierarchy" delimiter="." replace="." reverse="true"/>
  </analyzer>
</fieldType>

带类名(旧版)

<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="." replace="." reverse="true"/>
  </analyzer>
</fieldType>

输入:"www.site.co.uk"

输出:"www.site.co.uk", "site.co.uk", "co.uk", "uk"

正则表达式模式标记化器

此标记化器使用 Java 正则表达式将输入文本流分解为标记。pattern 参数提供的表达式可以解释为分隔标记的分隔符,或匹配应从文本中提取为标记的模式。

请参阅 java.util.regex.Pattern 的 Javadocs 以获取有关 Java 正则表达式语法的更多信息。

工厂类: solr.PatternTokenizerFactory

参数

pattern

必需

默认值:无

正则表达式,如 java.util.regex.Pattern 中所定义。

group

可选

默认值:-1

指定要作为标记提取的正则表达式组。值 -1 表示应将正则表达式视为分隔标记的分隔符。非负组号 (>= 0) 表示应将与该正则表达式组匹配的字符序列转换为标记。组零表示整个正则表达式,大于零的组表示正则表达式的括号子表达式,从左到右计数。

示例

逗号分隔列表。标记由零个或多个空格、一个逗号和零个或多个空格分隔。

带名称

<analyzer>
  <tokenizer name="pattern" pattern="\s*,\s*"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
</analyzer>

输入:"fee,fie, foe , fum, foo"

输出:"fee", "fie", "foe", "fum", "foo"

示例

提取简单的、大写的单词。一个或多个大写字母后跟零个或多个大小写的字母的序列将被提取为标记。

带名称

<analyzer>
  <tokenizer name="pattern" pattern="[A-Z][A-Za-z]*" group="0"/>
</analyzer>

带类名(旧版)

<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”、“部件”或“部件号”开头的部件号,区分大小写,并带有可选的分号分隔符。部件号必须是所有数字,并带有可选连字符。正则表达式捕获组通过从左到右计算左括号进行编号。组 3 是子表达式“[0-9-]+”,它匹配一个或多个数字或连字符。

带名称

<analyzer>
  <tokenizer name="pattern" pattern="(SKU|Part(\sNumber)?):?\s(\[0-9-\]+)" group="3"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.PatternTokenizerFactory" pattern="(SKU|Part(\sNumber)?):?\s(\[0-9-\]+)" group="3"/>
</analyzer>

输入:“SKU:1234,部件号 5678,部件:126-987”

输出 "1234", "5678", "126-987"

简化正则表达式模式标记器

此标记器类似于上面描述的PatternTokenizerFactory,但使用 Lucene RegExp 模式匹配为输入流构建不同的标记。其语法比PatternTokenizerFactory更有限,但标记化速度更快。

工厂类:solr.SimplePatternTokenizerFactory

参数

pattern

必需

默认值:无

正则表达式(如 RegExp javadocs 中定义的)用于识别要包含在标记中的字符。匹配是贪婪的,以便在给定点匹配最长的标记。永远不会创建空标记。

determinizeWorkLimit

可选

默认值:10000

从正则表达式计算的确定自动机的总状态数限制。

示例

要匹配由简单空格字符分隔的标记

带名称

<analyzer>
  <tokenizer name="simplePattern" pattern="[^ \t\r\n]+"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.SimplePatternTokenizerFactory" pattern="[^ \t\r\n]+"/>
</analyzer>

简化正则表达式模式拆分标记器

此标记器类似于上面描述的SimplePatternTokenizerFactory,但使用 Lucene RegExp 模式匹配来识别应用于拆分标记的字符序列。其语法比PatternTokenizerFactory更有限,但标记化速度更快。

工厂类:solr.SimplePatternSplitTokenizerFactory

参数

pattern

必需

默认值:无

正则表达式(如 RegExp javadocs 中定义的)用于识别应拆分标记的字符。匹配是贪婪的,以便在给定点匹配最长的标记分隔符。永远不会创建空标记。

determinizeWorkLimit

可选

默认值:10000

从正则表达式计算的确定自动机的总状态数限制。

示例

要匹配由简单空格字符分隔的标记

带名称

<analyzer>
  <tokenizer name="simplePatternSplit" pattern="[ \t\r\n]+"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.SimplePatternSplitTokenizerFactory" pattern="[ \t\r\n]+"/>
</analyzer>

UAX29 URL 电子邮件标记器

此标记器将文本字段拆分为标记,将空格和标点符号视为分隔符。分隔符字符将被丢弃,但以下情况除外

  • 不后跟空白的句点(点)作为标记的一部分保留。

  • 单词在连字符处拆分,除非单词中包含数字,在这种情况下,标记不会拆分,数字和连字符将被保留。

  • 识别并保留以下内容作为单个标记

    • 当生成标记器时,互联网域名包含针对 IANA 根区域数据库 中白名单验证的顶级域

    • 电子邮件地址

    • file://http(s)://ftp:// URL

    • IPv4 和 IPv6 地址

UAX29 URL 电子邮件标记器支持 Unicode 标准附件 UAX#29 单词边界,并具有以下标记器类型:<ALPHANUM><NUM><URL><EMAIL><SOUTHEAST_ASIAN><IDEOGRAPHIC><HIRAGANA>

工厂类: solr.UAX29URLEmailTokenizerFactory

参数

maxTokenLength

可选

默认值:255

Solr 忽略超出 maxTokenLength 指定的字符数的标记。

示例

带名称

<analyzer>
  <tokenizer name="uax29URLEmail"/>
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
</analyzer>

输入:“访问 http://accarol.com/contact.htm?from=external&a=10 或发送电子邮件 [email protected]

输出:“访问”、“http://accarol.com/contact.htm?from=external&a=10”、“或”、“e”、“mail”、“[email protected]

空白标记器

简单的标记器,它在空白处拆分文本流,并将非空白字符序列作为标记器返回。请注意,任何标点符号都会包含在标记器中。

工厂类: solr.WhitespaceTokenizerFactory

参数

规则

可选

默认值:java

指定如何定义空白以进行标记化。有效值

maxTokenLen

可选

默认值:255

分词器将发出的最大标记长度。

示例

带名称

<analyzer>
  <tokenizer name="whitespace" rule="java" />
</analyzer>

带类名(旧版)

<analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory" rule="java" />
</analyzer>

输入:“To be, or what?”

输出:“To”、“be,”、“or”、“what?”

OpenNLP 标记器和 OpenNLP 过滤器

请参阅 OpenNLP 集成,了解有关使用 OpenNLP 标记器以及有关可用的 OpenNLP 标记器过滤器的信息。