文章目录
说明:
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();
}
}
}