为Text类型的字段设置分词类型后,系统会根据设定的分词类型将可分词的内容分成多个词。非Text类型的字段不能设置分词类型。TEXT类型的字段不支持排序和统计聚合。如果Text类型的字段同时需要进行排序或统计聚合,可以通过虚拟列为Keyword类型实现。
背景信息
对于Text类型字段,常用于匹配查询(MatchQuery)和短语匹配查询(MatchPhraseQuery),少部分场景也会用到精确查询(TermQuery)、多词精确查询(TermsQuery)、前缀查询(PrefixQuery)、通配符查询(WildcardQuery)等。
分词类型
目前支持单字分词、分隔符分词、最小数量语义分词、最大数量语义分词和模糊分词5种分词类型。
所有分词类型都可以应用于模糊查询场景,具体如何选择请参见详解TableStore模糊查询。
单字分词(SingleWord)
单字分词适用于汉语、英语、日语等所有语言文字。Text类型字段的默认分词类型为单字分词。
设置分词类型为单字分词后,具体的分词方式如下:
汉语会按照“字”切分。例如“杭州”会切分成“杭”和“州”,通过MatchQuery或MatchPhraseQuery查询“杭”可以查询到含有“杭州”内容的数据。
英文字母或数字会按照空格或标点符号切分。
当
caseSensitive
为false时,不区分大小写,表格存储会将分词后的英文字母全部转换为小写字母进行存储。例如“Hang Zhou”会切分成“hang”和“zhou”,通过MatchQuery或MatchPhraseQuery查询“hang”或“HANG”或“Hang”都能查询到该行数据。
当
caseSensitive
为true时,区分大小写,表格存储会将分词后的英文字母区分大小写进行存储。例如“Hang Zhou”会切分成“Hang”和“Zhou”,通过MatchQuery或MatchPhraseQuery查询“Hang”或“Zhou”都能查询到该行数据。
对于数字和英文字母连接在一起的词,例如商品型号等,也会按照空格或标点符号切分,但是默认情况下数字和英文不会拆分开。例如“iphone6”会拆分成“iphone6”,通过MatchQuery或MatchPhraseQuery查询时,只有指定完整“iphone6”才能查询到,使用“iphone”查询不到。
如果需要将数字和英文拆分开,您可以设置delimitWord参数为true。此时“iphone6”会拆分成“iphone”和“6”,通过MatchQuery或MatchPhraseQuery查询“iphone”和“6”都能查询到该行数据。
单字分词的参数说明请参见下表。
参数 | 说明 |
caseSensitive | 是否大小写敏感。默认值是false,此时所有英文字母会转换为小写。 如果不需要系统自动将英文字母转换为小写字母,需要保持大小写敏感,可以设置caseSensitive为true。 |
delimitWord | 对于英文和数字连接在一起的单词,是否分割英文和数字。默认值是false,表示数字和英文不会拆分开。 如果需要将数字和英文拆分开,您可以设置delimitWord参数为true,此时“iphone6”会被拆分成“iphone”和“6”。 |
分隔符分词(Split)
表格存储提供了基于通用词典的分词,但是有些特殊行业需要一些自定义的辞典做分词,为了解决此问题,表格存储提供了分隔符分词,也叫做自定义分词,用户先按照自己的方式分词,再按照特定的分隔符进行分隔后写入表格存储。
分隔符分词适用于汉语、英语、日语等所有语言文字。
为Text类型字段配置了分隔符分词后,会按照分隔符delimiter指定值切分字段值。例如字段值为“羽毛球,乒乓球,说唱”,分隔符delimeter为英文逗号(,),则会切分为“羽毛球”、“乒乓球”和“说唱”并建立索引,通过MatchQuery或MatchPhraseQuery查询“羽毛球”、“乒乓球”、“说唱”或“羽毛球,乒乓球”均可以查询到该行数据。
分隔符分词的参数说明请参见下表。
参数 | 说明 |
caseSensitive | 是否大小写敏感。默认是false,此时所有英文字母会转换为小写。 如果不需要系统自动将英文字母转换为小写字母,需要保持大小写敏感,可以设置caseSensitive为true。 重要 从表格存储Java SDK5.17.2版本开始支持此配置。 |
delimiter | 分隔符,默认是空白字符,可以自定义分隔符。
|
最小数量语义分词(MinWord)
最小数量语义分词适用于汉语,一般应用于全文检索场景。
设置分词类型为最小数量语义分词后,系统按照语义对Text字段内容分词时,会将Text字段内容切分成最小数量的语义词。例如“梨花茶”会切分成“梨”和“花茶”,切分后的结果没有重合。再例如“中华人民共和国”会被切分成“中华人民共和国”。
最大数量语义分词(MaxWord)
最大数量语义分词适用于汉语,一般应用于全文检索场景。
设置分词类型为最大数量语义分词后,系统会尽量多的分出语义词,不同语义词之间会有重叠,总长度累加后会大于原文长度,索引大小也会膨胀。例如“梨花茶”会切分成“梨花”和“花茶”,切分后的结果没有重合。再例如“中华人民共和国”会被切分成“中华人民共和国”、“中华人民”、“中华”、“华人”、“人民共和国”、“人民”、“共和国”、“共和”和“国”。
此种分词类型的分词后结果更多,查询时命中的概率更大,但是索引大小会有比较大的膨胀。适合使用MatchQuery而非MatchPhraseQuery查询,如果使用MatchPhraseQuery查询,由于查询关键词中也会按照同样的方式分词,那么位置信息会重叠,就有可能导致搜索不到。
模糊分词(Fuzzy)
模糊分词适用于汉语、英语、日语等所有语言文字,一般应用于文本内容较短场景,例如标题、电影名称、书名、文件名、目录名等。
模糊分词可用于以很低的延迟返回结果,比WildcardQuery性能更好,但是索引大小会有一定膨胀。
设置分词类型为模糊分词后,系统对文本内容进行Ngram分词,结果介于minChars和maxChars之间。例如用在下拉提示等功能中。
要实现模糊查询时,您必须在进行模糊分词的列上使用MatchPhraseQuery,而不能使用其他Query。如果对该列有多种查询需求,请使用虚拟列功能。关于虚拟列的具体操作,请参见虚拟列。
限制
当Text字段的分词类型为模糊分词时,长度不能超过1024字符。如果超过长度限制,系统会将超过的字符截断丢弃,只保留前1024个字符。
为了防止索引数据量过度膨胀,最大和最小字符切分单元的差值(maxChars-minChars)不能超过15。
参数
参数
说明
minChars
最小字符切分单元,即切分的字符组合中字符数量必须大于等于此值,默认值为1。
maxChars
最大字符切分单元,即切分的字符组合中字符数量必须小于等于此值,默认值为7。
caseSensitive
是否大小写敏感。默认是false,此时所有英文字母会转换为小写。
如果不需要系统自动将英文字母转换为小写字母,需要保持大小写敏感,可以设置caseSensitive为true。
重要从表格存储Java SDK5.17.2版本开始支持此配置。
分词类型对比
从几个关键维度对不同分词的比较信息请参见下表。
对比项 | 单字分词 | 分隔符分词 | 最小数量语义分词 | 最大数量语义分词 | 模糊分词 |
索引膨胀 | 小 | 小 | 小 | 中 | 大 |
相关性影响 | 弱 | 弱 | 中 | 较强 | 较强 |
适用语言 | 所有 | 所有 | 汉语 | 汉语 | 所有 |
长度限制 | 无 | 无 | 无 | 无 | 1024字符 |
召回率 | 高 | 低 | 低 | 中 | 高 |
示例
通过如下示例查看各种分词器在索引时和查询时的分词效果。
索引时,分词字符串的值会被切分并建立索引;查询时,查询关键词也被切分,并尝试匹配之前建立的索引。
字段值为“中华人民共和国-国歌”,使用各类型分词器后索引的切词效果。
类型
参数
索引时分词
单字分词(SingleWord)
默认
“中”,“华”,“人”,“民”,“共”,“和”,“国”,“歌”
分隔符分词(Split)
delimiter: "-"
“中华人民共和国”,“国歌”
最小数量语义分词(MinWord)
默认
“中华人民共和国”,“国歌”
最大数据量语义分词(MaxWord)
默认
“中华人民共和国”,“中华人民”,“中华”,“华人”,“人民共和国”,“人民”,“共和国”,“共和”,“国”,“国歌”
模糊分词(Fuzzy)
minChars:1, maxChars:3
“中”,“中华”,“中华人”,“华”,“华人”,“华人民”,“人”,“人民”,“人民共”,“民”,“民共”,“民共和”,“共”,“共和”,“共和国”,“和”,“和国”,“国”,“国歌”,“歌”
字段值为“中华人民共和国-国歌”,使用各类型分词器后查询的切词效果。
类型
参数
查询时分词
单字分词(SingleWord)
默认
“中”,“华”,“人”,“民”,“共”,“和”,“国”,“歌”
分隔符分词(Split)
delimiter: "-"
“中华人民共和国”,“国歌”
最小数量语义分词(MinWord)
默认
“中华人民共和国”,“国歌”
最大数据量语义分词(MaxWord)
默认
“中华人民共和国”,“中华人民”,“中华”,“华人”,“人民共和国”,“人民”,“共和国”,“共和”,“国”,“国歌”
模糊分词(Fuzzy)
默认(minChars:1, maxChars:7)
“中华人民共和国”,“国歌”