一个 tokenizer(分词器)接收一个字符流,将之割为独立的 tokens(词元,通常是独立的单词),然后输出 tokens流。
例如,whitespace tokenizer遇到空白字符时分割文。它会将文本 "Quick brown fox!“ 分割为 [Quick, brown, fox]。该 tokenizer(分词器)还负责记录各个term(词条)的顺序或 position 位置(用于 phrase短语和 word proximity 词近邻查询),以及term(词条)所代表的原始word(单词)的 start(起始)和end(结束)的 character offsets(字符偏移量)(用于高亮显示搜索的内容)。
ElasticSearch 提供了很多内置的分词器,可以用来构建 custom analyzers(自定义分词器)
POST _analyze
{
"analyzer": "standard",
"text": "Note however that storage is optimized based on the actual values that are stored"
}
返回结果
{
"tokens" : [
{
"token" : "note",
"start_offset" : 0,
"end_offset" : 4,
"type" : "",
"position" : 0
},
{
"token" : "however",
"start_offset" : 5,
"end_offset" : 12,
"type" : "",
"position" : 1
},
{
"token" : "that",
"start_offset" : 13,
"end_offset" : 17,
"type" : "",
"position" : 2
},
{
"token" : "storage",
"start_offset" : 18,
"end_offset" : 25,
"type" : "",
"position" : 3
},
...
但是如果是中文场景下就会出现一些问题:
POST _analyze
{
"analyzer": "standard",
"text": "更改其他索引的字段的映射"
}
返回结果如下,可见将每一个汉字进行了分割,明显不符合实际情况。
{
"tokens" : [
{
"token" : "更",
"start_offset" : 0,
"end_offset" : 1,
"type" : "",
"position" : 0
},
{
"token" : "改",
"start_offset" : 1,
"end_offset" : 2,
"type" : "",
"position" : 1
},
{
"token" : "其",
"start_offset" : 2,
"end_offset" : 3,
"type" : "",
"position" : 2
},
...
在es目录下的plugins
目录下创建一个新文件夹,命名为ik
,然后把上面的压缩包中的内容解压到该目录中。
把解压出来的内容放到es/plugins/ik中。之后,需要重新启动es。
再次测试:
POST _analyze
{
"analyzer": "ik_smart",
"text": "你是列文虎克吗"
}
结果:
{
"tokens" : [
{
"token" : "你",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "列",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 2
},
{
"token" : "文虎",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "克",
"start_offset" : 5,
"end_offset" : 6,
"type" : "CN_CHAR",
"position" : 4
},
{
"token" : "吗",
"start_offset" : 6,
"end_offset" : 7,
"type" : "CN_CHAR",
"position" : 5
}
]
}
从上面的例子中可以看到 列文虎克 被拆开了,因为ik分词器依旧不支持部分内容,我们可以自定义分词词库
在elasticsearch-5.6.8\plugins\ik\config下
新增一个z_SelfAdd.dic文件,在里面加上新的单词,保存为UTF-8
然后在当前目录下的IKAnalyzer.cfg.xml配置文件中下加上
将刚才命名的文件加入
重启就生效了