分词器使用的两个情形:
1,Index time analysis. 创建或者更新文档时,会对文档进行分词
2,Search time analysis. 查询时,对查询语句分词
- 查询时通过analyzer指定分词器
- 创建index mapping时指定search_analyzer
注意:
明确字段是否需要分词,不需要分词的字段将type设置为keyword,可以节省空间和提高写性能。
运行结果:
ES内置了很多种analyzer。比如:
standard 由以下组成
tokenizer:Standard Tokenizer
token filter:Standard Token Filter,Lower Case Token Filter,Stop Token Filter
得到结果:
whitespace 空格为分隔符
simple
stop 默认stopwords用_english_
keyword 不分词的
es内置很多分词器,但是对中文分词并不友好,例如使用standard分词器对一句中文话进行分词,会分成一个字一个字的。这时可以使用第三方的Analyzer插件,比如 ik、pinyin等。这里以ik为例
1,首先安装插件,重启es:
2,使用示例:
GET _analyze
{
"analyzer": "ik_smart",
"text": "你好吗?我有一句话要对你说呀。"
}
参考:https://github.com/medcl/elasticsearch-analysis-ik
还可以用内置的 character filter, tokenizer, token filter 组装一个analyzer(custom analyzer)
custom 定制analyzer,由以下几部分组成
0个或多个e character filters
1个tokenizer
0个或多个 token filters
自定义分词需要在索引的配置中设定,如下所示:
会影响后续tokenizer解析的position和offset信息
html strip 除去html标签和转换html实体
参数:escaped_tags不删除的标签
mapping 映射类型,以下参数必须二选一
mappings 指定一组映射,每个映射格式为 key=>value
mappings_path 绝对路径或者相对于config路径 key=>value
pattern replace
pattern参数 正则
replacement 替换字符串 可以使用$1..$9
flags 正则标志
standard
参数:max_token_length,最大token长度,默认是255
letter 非字母时分成多个terms
lowcase 跟letter tokenizer一样 ,同时将字母转化成小写
whitespace 按照空白字符分成多个terms
参数:max_token_length
keyword 空操作,输出完全相同的文本
参数:buffer_size,单词一个term读入缓冲区的长度,默认256
lowercase 将输出的单词转化成小写
stop 从token流中删除stop words 。