elasticsearch安装中文分词(ik)与添加自定义词库

es的分词对中文不友好,要中文分词器插件,

安装ik服务 (记得改好版本号)

./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 的扩展字典

有一些词,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 加到配置上

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">;
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict">my.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

索引数据及使用ik查看

我是使用postman工具来发请求到es服务的

删除索引

http://192.168.51.98:9200/es_ik delete方法

ik创建索引(含结构

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" : ["<b>", "<tag2>"],
        "post_tags" : ["</b>", "</tag2>"],
        "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": [
                        "华为已经是世界第三大电子科技公司,根据华为<b>2017年</b>12月29日公布的新年贺词,<b>2017年</b><b>集团</b><b>预计</b>年收入超过6000亿元人民币,而2016年是5216亿元"
                    ]
                }
            },
            {
                "_index": "es_ik",
                "_type": "user",
                "_id": "AWEsBiJuWnxPV3c34PLu",
                "_score": 1.3313438,
                "_source": {
                    "name": "举个例子,2017年腾讯和阿里都将成为百亿美元净利润公司,这是非常惊人的,远远超过中国所有的制造业企业。后面还有网易,百度等科技企业在紧紧追赶,另外还有个在向云转型的华为"
                },
                "highlight": {
                    "name": [
                        "举个例子,<b>2017年</b>腾讯和<b>阿里</b>都将成为百亿美元净利润公司,这是非常惊人的,远远超过中国所有的制造业企业。后面还有网易,百度等科技企业在紧紧追赶,另外还有个在向云转型的华为"
                    ]
                }
            },
            {
                "_index": "es_ik",
                "_type": "user",
                "_id": "AWEsBmNKWnxPV3c34PLw",
                "_score": 0.37145406,
                "_source": {
                    "name": "例如腾讯和阿里在今年净利润都将是百亿美元的情况下,腾讯上半年净利润增长高达43%,阿里2018年第一财季(今年4月-6月)不按美国通用会计准则计算净利润增速高达67%,第二财季更是高达71%,如果按照美国通用会计准则计算则增速更快"
                },
                "highlight": {
                    "name": [
                        "例如腾讯和<b>阿里</b>在今年净利润都将是百亿美元的情况下,腾讯上半年净利润增长高达43%,<b>阿里</b>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不变价格不变汇率计算的话,印度<b>2017年</b>的经济增量只有全球大概6%左右。和中美不是一个量级,其他国家就更不用说了"
                    ]
                }
            }
        ]
    }
}

安装 smartcn

官方那边经常使用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":"我是中国人"}  
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值