ElasticSearch的中文分词

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhanglh046/article/details/78536267

一ElasticSearch安装中文分词器

1.1 gitclone https://github.com/medcl/elasticsearch-analysis-ik

1.2 gitcheckout tags/v5.2.0

1.3 mvnpackage

1.4将target/releases/elasticsearch-analysis-ik-5.2.0.zip拷贝到

ES/plugins/ik目录下

1.5 在ES/plugins/ik下对elasticsearch-analysis-ik-5.2.0.zip进行解压缩

1.6 重启ES

 

二 IK分词器的基础

2.1ik_max_word

会将文本做最细粒度的拆分

POST /ecommerce/_analyze

{

   "text":"深秋嫩绿的垂柳",

   "analyzer":"ik_max_word"

}

它会拆分成"深秋","嫩绿","垂柳","绿","垂","柳"

2.2ik_smart

会做最粗粒度的拆分

POST /ecommerce/_analyze

{

   "text":"深秋嫩绿的垂柳",

   "analyzer":"ik_smart"

}

"深秋","嫩绿","垂柳"

 

三 IK分词器的使用

3.1 首先建立映射

PUT/ecommerce

{

    "mappings": {

        "music":{

             "properties": {

                "brand": {

                  "type":"text",

                  "analyzer":"ik_max_word",

                  "fields": {

                     "keyword": {

                        "type":"keyword",

                        "ignore_above": 256

                     }

                  }

                },

                "desc": {

                  "type":"string",

                  "analyzer":"ik_max_word",

                  "fields": {

                     "keyword": {

                        "type":"keyword",

                       "ignore_above": 256

                     }

                  }

                },

                "sales":{

                      "type":"long"

                },

                "price":{

                      "type":"float"

                },

                "review":{

                      "type":"integer"

                },

                "color":{

                  "type":"string",

                  "analyzer":"ik_max_word",

                  "fields": {

                     "keyword": {

                        "type":"keyword",

                       "ignore_above": 256

                     }

                  }

                },

                "origin":{

                  "type":"string",

                  "analyzer":"ik_max_word",

                  "fields": {

                     "keyword": {

                        "type":"keyword",

                       "ignore_above": 256

                     }

                  }

                },

                "c_date":{

                  "type":"date"

                }   

          }

        }

    }

}

3.2 然后添加数据

PUT /ecommerce/music/1

{

    "brand":"雅马哈",

    "desc":"正品YAMAHA雅马哈F310  F600初学者入门男女学生民谣木吉他 41寸",

    "color":"红",

    "origin":"美国",

    "sales":1914,

    "price":799.00,

    "review":786,

   "c_date":"2015-12-21"

}

PUT /ecommerce/music/2

{

    "brand":"雅马哈",

    "desc":"雅马哈FG800单板民谣木吉他 FGX800C电箱吉他FG700S升级41/40寸",

    "color":"黄",

    "origin":"美国",

    "sales":102,

    "price":1590.00,

    "review":349,

   "c_date":"2016-09-12"

}

3.3 分词分析

POST /ecommerce/_analyze

{

    "text":"美德威MP2000X智能电钢琴88键重锤成人电子钢琴家用数码电钢专业",

   "analyzer":"ik_max_word"

}

3.4 查询数据

POST /ecommerce/music/_search

{

   "query":{

       "match": {

           "desc":"罗兰"

       }

   }

}

 

POST /ecommerce/music/_search

{

   "query":{

      "constant_score": {

         "filter": {

             "term":{

                "desc":"吉他"

             }

         }

      }

   }

}

 

四 配置IK

IK默认提供的很多分词,并不能满足我们所有的情况,不同公司,可能都有自己的数据,而且还有一些最近流行的一些新词也是没有。所以这就需要我们更新词库

我们首先需要进到IK的config目录,有一个IKAnalyzer.cfg.xml的配置文件

main.dic:ik原生内置的中文词库

quantifier.dic:放了一些单位相关的词

suffix.dic:放了一些后缀

surname.dic:中国的姓氏

stopword.dic:英文停用词

在custom目录下也放了些词库

ext_stopword.dic:扩展的停用词,我们可以用来添加中文停用词

 

五 IK词库的热更新

我们如果每次需要手动去更新词库,每次都要重启ElasticSearch,如果集群数量太多,比如几百台 怎么去弄,所以我们有必要再不重启ElasticSearch的情况下热更新

 

5.1热更新的方案

# 修改ik分词器源码,然后手动支持从mysql中每隔一定时间,自动加载新的词库

# 基于ik分词器原生支持的热更新方案,部署一个web服务器,提供一个http接口,通过modified和tag两个http响应头,来提供词语的热更新

一般公司都会采用第一种,第二种官方都不建议,因为不稳定

核心思想就是不停的reload你想更新的词典文件,比如ext_stop.dic或者main.dic,然后读取数据库里面的配置更新。

5.2 热更新代码

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试