es的分词对中文不友好,要中文分词器插件,
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.10/elasticsearch-analysis-ik-5.6.10.zip
如果服务器网络不行,则可直接下载后安装
安装及文件,请参考: https://github.com/medcl/elasticsearch-analysis-ik
安装完后要重启才能生效,如果有装好analysis-ik,启动日志会有[analysis-ik]:
[2018-01-25T08:31:51,816][INFO ][o.e.p.PluginsService ] [master] loaded module [parent-join]
[2018-01-25T08:31:51,816][INFO ][o.e.p.PluginsService ] [master] loaded module [percolator]
[2018-01-25T08:31:51,817][INFO ][o.e.p.PluginsService ] [master] loaded module [reindex]
[2018-01-25T08:31:51,817][INFO ][o.e.p.PluginsService ] [master] loaded module [transport-netty3]
[2018-01-25T08:31:51,817][INFO ][o.e.p.PluginsService ] [master] loaded module [transport-netty4]
[2018-01-25T08:31:51,837][INFO ][o.e.p.PluginsService ] [master] loaded plugin [analysis-ik]
[2018-01-25T08:32:00,010][INFO ][o.e.d.DiscoveryModule ] [master] using discovery type [zen]
查看安装的插件:
GET /_cat/plugins?v&s=component&h=name,component,version,description
es默认的分词器有挺多,可以用以下几条请求对比下其分词情况 :
先队伍创建 一个索引
http://xxxxx:9200/es_ik
{
"mappings": {
"a_info": {
"dynamic": "false",
"_all": {
"enabled": false
},
"properties": {
"seqno": {
"type": "text"
},
"title": {
"type": "text",
"index": "analyzed",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"price": {
"type": "integer"
},
"buynum": {
"type": "integer"
},
"confirm_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
},
"update_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
},
"description": {
"type": "text",
"index": "analyzed",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
}
}
}
}
}
http://192.168.51.98:9200/es_ik/_analyze post方法
{
"analyzer": "whitespace",
"text": "实际上,全球市值排名前七位的中美七家科技公司,除了亚马逊以外,全部都是百亿美元级别净利润企业."
}
{
"analyzer": "standard",
"text": "实际上,全球市值排名前七位的中美七家科技公司,除了亚马逊以外,全部都是百亿美元级别净利润企业."
}
{
"analyzer": "simple",
"text": "实际上,全球市值排名前七位的中美七家科技公司,除了亚马逊以外,全部都是百亿美元级别净利润企业."
}
上面这几种 默认的分词器显示出来都不太友好,大家可以自行尝试,
使用ik的分析器:
{
"analyzer": "ik_smart",
"text": "实际上,全球市值排名前七位的中美七家科技公司,除了亚马逊以外,全部都是百亿美元级别净利润企业."
}
结果:
{
"tokens": [
{
"token": "实际上",
"start_offset": 0,
"end_offset": 3,
"type": "CN_WORD",
"position": 0
},
{
"token": "全球",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 1
},
{
"token": "市值",
"start_offset": 6,
"end_offset": 8,
"type": "CN_WORD",
"position": 2
},
{
"token": "排名",
"start_offset": 8,
"end_offset": 10,
"type": "CN_WORD",
"position": 3
},
{
"token": "前",
"start_offset": 10,
"end_offset": 11,
"type": "CN_CHAR",
"position": 4
},
{
"token": "七位",
"start_offset": 11,
"end_offset": 13,
"type": "CN_WORD",
"position": 5
},
{
"token": "的",
"start_offset": 13,
"end_offset": 14,
"type": "CN_CHAR",
"position": 6
},
{
"token": "中美",
"start_offset": 14,
"end_offset": 16,
"type": "CN_WORD",
"position": 7
},
{
"token": "七家",
"start_offset": 16,
"end_offset": 18,
"type": "TYPE_CQUAN",
"position": 8
},
{
"token": "科技",
"start_offset": 18,
"end_offset": 20,
"type": "CN_WORD",
"position": 9
},
{
"token": "公司",
"start_offset": 20,
"end_offset": 22,
"type": "CN_WORD",
"position": 10
},
{
"token": "除了",
"start_offset": 23,
"end_offset": 25,
"type": "CN_WORD",
"position": 11
},
{
"token": "亚马逊",
"start_offset": 25,
"end_offset": 28,
"type": "CN_WORD",
"position": 12
},
{
"token": "以外",
"start_offset": 28,
"end_offset": 30,
"type": "CN_WORD",
"position": 13
},
{
"token": "全部都是",
"start_offset": 31,
"end_offset": 35,
"type": "CN_WORD",
"position": 14
},
{
"token": "百亿",
"start_offset": 35,
"end_offset": 37,
"type": "CN_WORD",
"position": 15
},
{
"token": "美元",
"start_offset": 37,
"end_offset": 39,
"type": "CN_WORD",
"position": 16
},
{
"token": "级别",
"start_offset": 39,
"end_offset": 41,
"type": "CN_WORD",
"position": 17
},
{
"token": "净利润",
"start_offset": 41,
"end_offset": 44,
"type": "CN_WORD",
"position": 18
},
{
"token": "企业",
"start_offset": 44,
"end_offset": 46,
"type": "CN_WORD",
"position": 19
}
]
}
参考:
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/_testing_analyzers.html
有一些词,ik默认的词库不知道,会拆成多个字,如下,科比 会被拆成 科 和 比
{
"analyzer": "ik_smart",
"text": "科比今天得了10分."
}
结果:
{
"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": 4,
"type": "CN_WORD",
"position": 2
},
{
"token": "得了",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 3
},
{
"token": "10分",
"start_offset": 6,
"end_offset": 9,
"type": "TYPE_CQUAN",
"position": 4
}
]
}
找到相应配置
${es_home}/config/analysis-ik/IKAnalyzer.cfg.xml
新建一个dic 文件,vi ${es_home}/config/my.dic 里面填上 “科比” 即可,要多个名词,写成多行就行。
把my.dic 加到配置上
;
IK Analyzer 扩展配置
my.dic
我是使用postman工具来发请求到es服务的
http://192.168.51.98:9200/es_ik delete方法
http://192.168.51.98:9200/es_ik put方法
入参: user属性有name 且使用ik_smart索引,
{
"mappings": {
"user": {
"properties": {
"name": {
"type":"text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
}
}
}
}
}
http://192.168.51.98:9200/es_ik/user post方法
加了四条数据,四次请求!
{
"name": "举个例子,2017年腾讯和阿里都将成为百亿美元净利润公司,这是非常惊人的,远远超过中国所有的制造业企业。后面还有网易,百度等科技企业在紧紧追赶,另外还有个在向云转型的华为"
}
{
"name": "正如一个行业在自由竞争会逐渐走向公司寡头化一样,我们的世界在自由竞争下,也会逐渐走向国家寡头化。这也是中国为什么力挺全球化,全球化有利于打破国与国的有形和无形边界,对超级大国有利"
}
{
"name": "例如腾讯和阿里在今年净利润都将是百亿美元的情况下,腾讯上半年净利润增长高达43%,阿里2018年第一财季(今年4月-6月)不按美国通用会计准则计算净利润增速高达67%,第二财季更是高达71%,如果按照美国通用会计准则计算则增速更快"
}
{
"name": "华为已经是世界第三大电子科技公司,根据华为2017年12月29日公布的新年贺词,2017年集团预计年收入超过6000亿元人民币,而2016年是5216亿元"
}
http://192.168.51.98:9200/es_ik/user/_search
{
"query" : { "match" : { "name" : "2017年集团预计 阿里" }},
"highlight" : {
"pre_tags" : ["", ""],
"post_tags" : [" ", ""],
"fields" : {
"name" : {}
}
}
}
结果 :
{
"took": 315,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 2.518611,
"hits": [
{
"_index": "es_ik",
"_type": "user",
"_id": "AWEsBoy5WnxPV3c34PLx",
"_score": 2.518611,
"_source": {
"name": "华为已经是世界第三大电子科技公司,根据华为2017年12月29日公布的新年贺词,2017年集团预计年收入超过6000亿元人民币,而2016年是5216亿元"
},
"highlight": {
"name": [
"华为已经是世界第三大电子科技公司,根据华为2017年12月29日公布的新年贺词,2017年集团预计年收入超过6000亿元人民币,而2016年是5216亿元"
]
}
},
{
"_index": "es_ik",
"_type": "user",
"_id": "AWEsBiJuWnxPV3c34PLu",
"_score": 1.3313438,
"_source": {
"name": "举个例子,2017年腾讯和阿里都将成为百亿美元净利润公司,这是非常惊人的,远远超过中国所有的制造业企业。后面还有网易,百度等科技企业在紧紧追赶,另外还有个在向云转型的华为"
},
"highlight": {
"name": [
"举个例子,2017年腾讯和阿里都将成为百亿美元净利润公司,这是非常惊人的,远远超过中国所有的制造业企业。后面还有网易,百度等科技企业在紧紧追赶,另外还有个在向云转型的华为"
]
}
},
{
"_index": "es_ik",
"_type": "user",
"_id": "AWEsBmNKWnxPV3c34PLw",
"_score": 0.37145406,
"_source": {
"name": "例如腾讯和阿里在今年净利润都将是百亿美元的情况下,腾讯上半年净利润增长高达43%,阿里2018年第一财季(今年4月-6月)不按美国通用会计准则计算净利润增速高达67%,第二财季更是高达71%,如果按照美国通用会计准则计算则增速更快"
},
"highlight": {
"name": [
"例如腾讯和阿里在今年净利润都将是百亿美元的情况下,腾讯上半年净利润增长高达43%,阿里2018年第一财季(今年4月-6月)不按美国通用会计准则计算净利润增速高达67%,第二财季更是高达71%,如果按照美国通用会计准则计算则增速更快"
]
}
},
{
"_index": "es_ik",
"_type": "user",
"_id": "AWEsBfmZWnxPV3c34PLt",
"_score": 0.29413795,
"_source": {
"name": "其他国家和中美差距太大,全球除了中美,经济增量最大的就是印度排世界第三,但是按照2016年的美元GDP不变价格不变汇率计算的话,印度2017年的经济增量只有全球大概6%左右。和中美不是一个量级,其他国家就更不用说了"
},
"highlight": {
"name": [
"其他国家和中美差距太大,全球除了中美,经济增量最大的就是印度排世界第三,但是按照2016年的美元GDP不变价格不变汇率计算的话,印度2017年的经济增量只有全球大概6%左右。和中美不是一个量级,其他国家就更不用说了"
]
}
}
]
}
}
官方那边经常使用smartcn 插件,没有用ik,
安装,安装后重启即可
es/elasticsearch-5.6.10/bin$ sh elasticsearch-plugin install analysis-smartcn
我们可以简单对比ik和smartcn 的结果,使用层面上,和ik是一样的.
GET _analyze
{"analyzer":"smartcn","text":"我是中国人"}
# ik的对比
GET _analyze
{"analyzer":"ik_smart","text":"我是中国人"}