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 加到配置上


;

        IK Analyzer 扩展配置
        
        my.dic
         
        
        
        
        
        

索引数据及使用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" : ["", ""],
        "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

官方那边经常使用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":"我是中国人"}  

你可能感兴趣的:(elasticsearch)