前面章节已经安装了分词器,但是关于分词器的具体使用方式,一直没有仔细研究,今天大概研究了下,记录下来作为备忘。
- 英文分词
英文分词是按照空格来分的,请求参数如下:
POST http://10.140.188.135:9200/_analyze
{
"text": "hello word"
}
返回内容:
{
"tokens": [
{
"token": "hello",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "word",
"start_offset": 6,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
}
]
}
无论内容是否正确,都是按照空格来分词:
POST http://10.140.188.135:9200/_analyze
{
"text": "nihao word"
}
返回内容:
{
"tokens": [
{
"token": "nihao",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "word",
"start_offset": 6,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
}
]
}
- 中文分词
默认的分词如下:
POST http://10.140.188.135:9200/_analyze
{
"text": "生活如此美丽"
}
返回内容:
{
"tokens": [
{
"token": "生",
"start_offset": 0,
"end_offset": 1,
"type": "<IDEOGRAPHIC>",
"position": 0
},
{
"token": "活",
"start_offset": 1,
"end_offset": 2,
"type": "<IDEOGRAPHIC>",
"position": 1
},
{
"token": "如",
"start_offset": 2,
"end_offset": 3,
"type": "<IDEOGRAPHIC>",
"position": 2
},
{
"token": "此",
"start_offset": 3,
"end_offset": 4,
"type": "<IDEOGRAPHIC>",
"position": 3
},
{
"token": "美",
"start_offset": 4,
"end_offset": 5,
"type": "<IDEOGRAPHIC>",
"position": 4
},
{
"token": "丽",
"start_offset": 5,
"end_offset": 6,
"type": "<IDEOGRAPHIC>",
"position": 5
}
]
}
默认分词把每一个汉字当成一个词来处理,这显然不是我们需要的。所以我们可以执行分词方式。
- 指定分词器
之前我们安装了IK分词器,IK分词器有两种分词方式,ik_max_word和ik_smart,区别是ik_max_word会做最细粒度的分词,而ik_smart会做最粗粒度的分词。具体可以通过下面自定义分词来理解。
ik_max_word方式分词:
POST http://10.140.188.135:9200/_analyze
{
"analyzer": "ik_max_word",
"text": "生活如此美好"
}
返回数据:
{
"tokens": [
{
"token": "生活",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "如此",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
},
{
"token": "美好",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 2
}
]
}
ik_smart分词方式:
POST http://10.140.188.135:9200/_analyze
{
"analyzer": "ik_smart",
"text": "生活如此美好"
}
返回数据:
{
"tokens": [
{
"token": "生活",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "如此",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
},
{
"token": "美好",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 2
}
]
}
可以看到,这句话两种分词方式结果一样。下面换一句就能看到区别了:
POST http://10.140.188.135:9200/_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国"
}
返回数据:
{
"tokens": [
{
"token": "中华人民共和国",
"start_offset": 0,
"end_offset": 7,
"type": "CN_WORD",
"position": 0
},
{
"token": "中华人民",
"start_offset": 0,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
},
{
"token": "中华",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 2
},
{
"token": "华人",
"start_offset": 1,
"end_offset": 3,
"type": "CN_WORD",
"position": 3
},
{
"token": "人民共和国",
"start_offset": 2,
"end_offset": 7,
"type": "CN_WORD",
"position": 4
},
{
"token": "人民",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 5
},
{
"token": "共和国",
"start_offset": 4,
"end_offset": 7,
"type": "CN_WORD",
"position": 6
},
{
"token": "共和",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 7
},
{
"token": "国",
"start_offset": 6,
"end_offset": 7,
"type": "CN_CHAR",
"position": 8
}
]
}
POST http://10.140.188.135:9200/_analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国"
}
返回数据:
{
"tokens": [
{
"token": "中华人民共和国",
"start_offset": 0,
"end_offset": 7,
"type": "CN_WORD",
"position": 0
}
]
}
可以看到,ik_max_word的方式,分词更为细致。而ik_smart分词的粒度更粗。
- 自定义分词
对于专业名字,需要自定义来配置,ik分词器支持自定义分词。具体方法如下。
到ik分词器安装目录下的config文件夹下,可以看到有dic后缀的文件,还有一个IKAnalyzer.cfg.xml文件,其中IKAnalyzer.cfg.xml为配置文件,dic为配置的分词文件。
新建一个mytest.dic文件,输入需要分词的内容(每一行表示一个分词):
生活如
此美好
活如
此美
修改IKAnalyzer.cfg.xml:
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">mytest.dic</entry>
重启es服务后,再查询结果如下:
POST http://10.140.188.135:9200/_analyze
{
"analyzer": "ik_max_word",
"text": "生活如此美好"
}
返回数据:
{
"tokens": [
{
"token": "生活如",
"start_offset": 0,
"end_offset": 3,
"type": "CN_WORD",
"position": 0
},
{
"token": "生活",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 1
},
{
"token": "活如",
"start_offset": 1,
"end_offset": 3,
"type": "CN_WORD",
"position": 2
},
{
"token": "如此",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 3
},
{
"token": "此美好",
"start_offset": 3,
"end_offset": 6,
"type": "CN_WORD",
"position": 4
},
{
"token": "此美",
"start_offset": 3,
"end_offset": 5,
"type": "CN_WORD",
"position": 5
},
{
"token": "美好",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 6
}
]
}
POST http://10.140.188.135:9200/_analyze
{
"analyzer": "ik_smart",
"text": "生活如此美好"
}
返回数据:
{
"tokens": [
{
"token": "生活如",
"start_offset": 0,
"end_offset": 3,
"type": "CN_WORD",
"position": 0
},
{
"token": "此美好",
"start_offset": 3,
"end_offset": 6,
"type": "CN_WORD",
"position": 1
}
]
}
可以看到,已经按照我们的意愿进行了分词,具体使用那种分词方式,就根据自己的需求确定了。
(在config目录中,原始的文件都是默认的分词的配置,如果把里面的“中华人民共和国”删除,则不会出现上面“中华人民共和国”作为一个整体的分词结果)。