IK分词器插件

什么是IK分词器?

分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如 “我爱狂神” 会被分为"我","爱","狂","神",这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。

IK提供了两个分词算法:ik_smart 和 ik_max_word,其中 ik_smart 为最少切分,ik_max_word为最细粒度划分!一会我们测试!

安装步骤

2022-08-15T07:00:17.png

  • 3、重新启动 ElasticSearch服务,在启动过程中,你可以看到正在加载"analysis-ik"插件的提示信息,服务启动后,在命令行运行elasticsearch-plugin list 命令,确认 ik 插件安装成功。

2022-08-15T07:01:03.png
2022-08-15T07:01:14.png

  • 4、在 kibana 中测试 ik 分词器,并就相关分词结果和 icu 分词器进行对比。

ik_max_word : 细粒度分词,会穷尽一个语句中所有分词可能,测试!
2022-08-15T07:01:49.png
ik_smart : 粗粒度分词,优先匹配最长词,只有1个词!
2022-08-15T07:02:15.png

  • 5、我们输入超级喜欢狂神说!发现狂神说被切分了

2022-08-15T07:02:34.png

如果我们想让系统识别“狂神说”是一个词,需要编辑自定义词库。
步骤:
(1)进入elasticsearch/plugins/ik/config目录
(2)新建一个my.dic文件,编辑内容:

狂神说

(3)修改IKAnalyzer.cfg.xml(在ik/config目录下)

<properties> 
  <comment>IK Analyzer 扩展配置</comment> 
  <!-- 用户可以在这里配置自己的扩展字典 --> 
  <entry key="ext_dict">my.dic</entry> 
  <!-- 用户可以在这里配置自己的扩展停止词字典 --> 
  <entry key="ext_stopwords">
  </entry> 
 </properties>

修改完配置重新启动elasticsearch,再次测试!
发现监视了我们自己写的规则文件:
2022-08-15T07:06:20.png
再次测试,发现狂神说变成了一个词:
2022-08-15T07:06:35.png
到了这里,我们就明白了分词器的基本规则和使用了!

Rest风格说明

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
基本Rest命令说明:
2022-08-15T07:08:57.png

基础测试

  • 1、首先我们浏览器 http://localhost:5601/ 进入 kibana里的Console
  • 2、首先让我们在 Console 中输入 :

    // 命令解释
    // PUT 创建命令 test1 索引 type1 类型 1 id
    PUT /test1/type1/1
    {
    "name":"狂神说", // 属性
    "age":16 // 属性
    }

返回结果 (是以REST ful 风格返回的 ):

// 警告信息:不支持在文档索引请求中指定类型 
// 而是使用无类型的端点(/{index}/_doc/{id}, /{index}/_doc,或 /{index}/_create/{id})。 
{ "_index" : "test1", // 索引 
    "_type" : "type1", // 类型 
    "_id" : "1", // id 
    "_version" : 1, // 版本 
    "result" : "created", // 操作类型 
    "_shards" : { // 分片信息 
      "total" : 2,
      "successful" : 1, 
      "failed" : 0 
    },"_seq_no" : 0, 
    "_primary_term" : 1 
}
  • 3、那么 name 这个字段用不用指定类型呢。毕竟我们关系型数据库 是需要指定类型的啊 !
    2022-08-15T07:14:27.png
  • 4、指定字段类型

    PUT /test2 {
    "mappings": {
    "properties": {
    "name":{ "type": "text" },
    "age":{ "type": "long" },
    "birthday":{ "type": "date" }
    }}} }

输出:

{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "test2" }
  • 5、查看一下索引字段

    {"test2":{

     "aliases":{
    
     },
     "mappings":{
         "properties":{
             "age":{
                 "type":"long"
             },
             "birthday":{
                 "type":"date"
             },
             "name":{
                 "type":"text"
             }
         }
     },
     "settings":{
         "index":{
             "creation_date":"1585384302712",
             "number_of_shards":"1",
             "number_of_replicas":"1",
             "uuid":"71TUZ84wRTW5P8lKeN4I4Q",
             "version":{
                 "created":"7060199"
             },
             "provided_name":"test2"
         }
     }

    }}

  • 6、我们看上列中 字段类型是我自己定义的 那么 我们不定义类型 会是什么情况呢?

    PUT /test3/_doc/1
    {
    "name":"狂神说",
    "age":13,
    "birth":"1997-01-05"
    }
    #输出
    {

     "_index":"test3",
     "_type":"_doc",
     "_id":"1",
     "_version":1,
     "result":"created",
     "_shards":{
         "total":2,
         "successful":1,
         "failed":0
     },
     "_seq_no":0,
     "_primary_term":1

    }

最后修改:2024 年 06 月 07 日
如果觉得我的文章对你有用,请随意赞赏