ElasticSearch之中文分词插件ik

说明:

1.我的es集群 在三台节点:
hadoop01 hadoop02 hadoop03
为了启动es,三台节点分别创建了普通用户hadoop并ssh了

2.安装ik时注意使用普通用户,免得装好后重启集群造成ik文件夹权限问题,es读不到
3.自己再记录一下ssh步骤
记录其中一台如hadoop03对hadoop01 02 03三台的免密登录 其他两台一样的配置

hadoop03下操作 最好root和hadoop用户都来一遍
第一步 :输入
ssh-keygen -t rsa
然后回车回车回车 目的就是生成几个文件 (貌似是 什么 …公钥私钥的信息 登陆过服务器的主机名)
第二步:配置
ssh-copy-id hadoop01 回车 输密码 退出
ssh-copy-id hadoop02 回车 输密码 退出
ssh-copy-id hadoop03 回车 输密码 退出
行了 hadoop03的ssh配好了

1. 安装es

有在线安装和离线安装两种方式 注意一定版本和es对应 我的是6.5.3版本
在线贼慢,推荐离线

在线安装 去es目录下:
 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.3/elasticsearch-analysis-ik-6.5.3.zip
  执行等待 三台都这样执行

我使用离线:
②下载IK-6.5.3
源码下载:https://github.com/medcl/elasticsearch-analysis-ik/releases
编译版本:elasticsearch-analysis-ik-6.5.3.zip
拷贝到一台到ES的目录下的plugins新建ik文件夹
我的目录/usr/local/elasticsearch-6.5.3/plugins/ik

mkdir ik
然后进入 cd ik 在这里解压
[root@hadoop02 ik]# unzip /home/elasticsearch-analysis-ik-6.5.3.zip
然后发送到另外两台
[root@hadoop02 plugins]# scp -r ./ik hadoop01:/usr/local/elasticsearch-6.5.3/plugins/
重启es集群

2.简单测试ik分词器

1.通过kibana验证中文分词插件安装成功否

POST _analyze
{
  "analyzer" : "ik_max_word",
  "text" : "中国人民警察的服务宗旨"
}

木得问题。
对了 ik分词器有两种模式ik_max_word和ik_smart
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
在这里插入图片描述
2、通过head插件验证安装成功否
(我直接安装谷歌浏览器的head插件 简单易用 不过安装需要翻下墙)
一样的结果
在这里插入图片描述

3.将ik分词器关联到索引库的字段上测试

1.先不关联索引库试试,就是先建一个默认的,跟以前一样
测一下

curl -XPUT http://hadoop01:9200/ok

##添加数据
curl -H 'Content-Type:application/json' -XPOST http://hadoop01:9200/ok/news/1 -d'{"content":"美国留给伊拉克的是个烂摊子吗"}'
curl -H 'Content-Type:application/json' -XPOST http://hadoop01:9200/ok/news/2 -d'{"content":"公安部:各地校车将享最高路权"}'
curl -H 'Content-Type:application/json' -XPOST http://hadoop01:9200/ok/news/3 -d'{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}'
curl -H 'Content-Type:application/json' -XPOST http://hadoop01:9200/ok/news/4 -d'{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}'	

然后查询

GET ok/news/_search
{
  "query": {
    "match": {
      "content": "男子"
    }
  }
}

可以看到并没有使用到分词器 只是简单的一个字作为一个词
在这里插入图片描述
2.现在另外创建索引库,并指定相应分词法
1)新建索引库 (也可以不新建索引库 使用ok索引库 但是type要新建 并指定分词法 不过6.x之后默认一个索引库一个type所以就最好新建个索引库)

curl -XPUT http://hadoop01:9200/chinese
2).create a mapping 要指定索引库下的type(这里就指定hot)对应的元数据信息(指定相应的中文分词插件,此处为ik)

注意:如果你要粘贴下边的代码,可能会报错
原因:Linux不识别Windows的回车
解决办法:将下面代码复制到Linux的一个shell脚本下 再复制出来 就可以使用了

curl -XPOST http://hadoop01:9200/chinese/hot/_mapping -H 'Content-Type:application/json' -d '{
                "properties": {
                        "content": {
                                "type": "text",
                                "analyzer": "ik_max_word",
                                "search_analyzer": "ik_max_word"
                        }
                }

}'                                                

3, 添加数据


curl  -H 'Content-Type:application/json' -XPOST http://hadoop01:9200/chinese/hot/1 -d'{"content":"美国留给伊拉克的是个烂摊子吗"}'
curl  -H 'Content-Type:application/json' -XPOST http://hadoop01:9200/chinese/hot/2 -d'{"content":"公安部:各地校车将享最高路权"}'
curl  -H 'Content-Type:application/json' -XPOST http://hadoop01:9200/chinese/hot/3 -d'{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}'
curl  -H 'Content-Type:application/json' -XPOST http://hadoop01:9200/chinese/hot/4 -d'{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}'

4,执行查询 结果显示: 将男子这俩字作为了一个词来查询 没有安装上面默认的一个字一个字来分

curl   -H 'Content-Type:application/json' -XPOST 'http://hadoop01:9200/chinese/hot/_search?pretty'  -d'{
        "query" : { "match" : { "content" : "男子" }},
        "highlight" : {
                        "pre_tags" : ["<font>", "<u>"],
                        "post_tags" : ["</font>", "</u>"],
                        "fields" : {"content" : {}}
                                }
}'

在这里插入图片描述
或者使用kibana 还是kibana好用 有提示
在这里插入图片描述

4.注意

要想分词器起作用 只有新建索引库指定库下面的type的分词器,建立mapping
分词器要全部节点安装
可以修改es配置文件 修改默认分词器为ik

注意点:
	①针对于es集群中已经存在的历史索引库,不会进行重新分词,分词插件不起作用。
	
	或者是新建的索引库,不指定特定的中文分词插件,也是用默认的。
	
	②新建索引库,以及索引库下的type时,要指定相应的中文分词插件,才会起作用。
	
	会根据分词插件,对新增的索引信息进行分词,这些词汇事先已经在中文分词插件的词库中已经定义好了。
	
	③需要将安装好的ik中文分词插件拷贝到集群中别的节点上。
	
	④给es集群安装插件时,优先安装中文分词插件(建议排在第一位!!)。
	
	可以通过如下方式简化使用ik分词插件
	
	修改ES_HOME/config/elasticsearch.yml文件,
	添加index.analysis.analyzer.default.type: ik(把IK设置为默认分词器,这一步是可选的)
					   
	⑤windows下的换行符是\r\n , Linux os下的换行符是\n ;
	将windows下的指令拷贝到linux命令行下执行,往往会报错,不能正常执行,
	应对方案是:a)先将内容粘贴到Linux下的临时文件中;b)然后从linux临时文件中拷贝

上面说修改配置文件不对!!! 5.x之后就废弃了修改配置文件配置默认分词器的方式!

具体可看链接:https://www.jianshu.com/p/6085af96c408
在这里插入图片描述

5、自定义词库

自定义词库有两种方式

第一种方法有两种方式
方式1:本地方式
/elasticsearch-6.5.3/plugins/ik/config/costomer/自定义的词库文件
/elasticsearch-6.5.3/plugins/ik/config/IKAnalyzer.cfg.xml,指定自定义词库文件的所在
跨节点拷贝 ,就是全部节点都要有 只有一台有不起作用
es集群重启
验证

方式2:远程方式 (建议:github注册账户,新建项目,上传mydic.dic资源 )

方式1步骤:
首先去es的plugins的2我们安好的ik的config目录下 新建个文件夹 costomer
然后制作一个dic文件 里面一行一个词 就是我们的分词器
然后去IKAnalyzer.cfg.xml配置文件添加我们的词库文件
分发到其他节点 然后重启es
验证
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

加上相对路径即可在这里插入图片描述
测试:注:这里忘记自定义词库之前测试了 我测了没截图 不过肯定是有ik分词器也没用
它又不知道把人名也作为一个词 同时我测试时是 不明觉厉也没有作为一个词
测试成功
在这里插入图片描述
在这里插入图片描述

上传到github的远程方式没有测试

6.自定义分词器

es的分词器往往包括3个低级构建块包:

character filters - 字符过滤器,可以添加、删除或更改字符来转换流,一个分析器可有多个字符过滤器;
token filters - token过滤器,接受token流,并可以添加、删除或修改token,不允许更改每个token的位置或字符偏移量,一个分析器可有多个token过滤器,并按顺序应用。
tokenizer - 标记器,接受字符流,将其分解成单独的标记,并输出标记流,一个分析器只能有一个标记器。

Elasticsearch提供的内置analyzers

Standard Analyzer
标准分析仪按照Unicode文本分段算法的定义,将文本分割成单词边界的分词。它删除了大多数标点符号,小写显示分词,并支持删除stop words。

Simple Analyzer
当遇到不是字母的字符时,简单的分析器会将文本分成条目。小写显示分词。

Whitespace Analyzer
空格分析器遇到任何空格字符时都会将文本分为多个项目。不会把分词转换为小写字母。

Stop Analyzer
停止分析仪和Simple Analyzer类似,但也支持stop words的删除。

Keyword Analyzer
一个“noop”分析器,它可以接受任何给定的文本,并输出完全相同的文本作为一个单词。

Pattern Analyzer
使用正则表达式拆分分词,支持lower-casing和stop words。

Language Analyzers
Elasticsearch提供许多语言特定的分析器,如英语或法语。

Fingerprint Analyzer
一个专门的分析仪,它可以创建一个可用于重复检测的指纹。

https://www.jianshu.com/p/13112fe5eaad

作者:byamao1
来源:简书
具体请查看:https://www.jianshu.com/p/6085af96c408

我这里做个对比
ik分词器的ik_smart效果

POST _analyze
{
  "analyzer" : "ik_smart",
  "text" : "这里有,最棒的ACG氛围,最有创意的Up主"
}

分出来贼多词
在这里插入图片描述

那么我自定义分词器 并测试 ,Simple :对中文文本以英文逗号作为分隔符分词:

这是用的也是内置的analyzers

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "simple"
        }
      }
    }
  }
}


POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "这里有,最棒的ACG氛围,最有创意的Up主"
}

就是简单分出三段,不愧是simple(当遇到不是字母的字符时,简单的分析器会将文本分成条目。小写显示分词。)
在这里插入图片描述

7.JavaAPI测试使用中文分词插件的情形

直接木有结果
在这里插入图片描述

具有ik分词器的Chinese的hot下面的内容出来结果了
在这里插入图片描述
具体API

package com.qf.test.demo5_ik;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * Created by Shi shuai RollerQing on 2019/11/22 15:37
 */
public class TestIK {
    //TransportClient实例 用于访问远程集群
    private TransportClient client;
    @Before
    public void init() throws UnknownHostException {
        Settings settings = Settings.builder().put("cluster.name", "my-elk").build();
        client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("hadoop01"), 9300));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("hadoop02"), 9300));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("hadoop03"), 9300));
    }
    //测试批量处理
    @Test
    public void testNoUseIK(){
        //需求:查询索引库ok中的type值news中,包含了“中国”的索引信息
        //需求:查询索引库chinese中的type值hot中,包含了“中国”的索引信息
        SearchResponse searchResponse = client.prepareSearch("chinese")
                .setTypes("hot")
                .setQuery(QueryBuilders.termQuery("content", "中国"))
                .get();
        //分析结果
        for (SearchHit hit : searchResponse.getHits()) {
            System.out.println(hit.getSourceAsString());
        }
    }
    @After
    public void cleanUp(){
        if(client != null){
            client.close();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值