本文重点:引擎分类、logstash、es、ik分词器、head插件
搜索引擎分类
1.网站搜索:例如百度、谷歌等
2.站内搜索:个人网站搜索
参考连接
https://blog.csdn.net/qq_41474525/article/details/128897962
https://learnku.com/docs/elasticsearch73/7.3/get-elasticsearch-up-and-running/6449
http://www.elasticsearch.cn/
ES相关概念
- 索引:相当于数据库。
- 类型:相当于数据库表。
- 文档:相当于数据库表行。
安装
访问ES官网直接下载解压,便可使用。解压成功后,进入bin目录,运行cmd,输入elasticsearch命令,即可看到es运行了两个端口,一个9200,一个9300,java连接es使用9300端口,除外都使用9200。
运行成功后,浏览器输入http://localhost:9200,便可看到如下界面。
使用
1. 新建索引
例如我们要新建一个叫articleindex的索引,就以put
方式提交
http://localhost:9200/articleindex/
结果如下:
2.新建文档
因为类型是弱引用,所以直接在url后面跟类型。例如:
新建一个article类型
的文档
:
POST: http://localhost:9200/articleindex/article
传入数据:
{
"title":"es学习笔记",
"content":"es新建文档"
}
返回结果:
3.查询
例如我们要查询刚刚创建的article类型的所有文档,给url后面加上"_search"
:
GET: http://localhost:9200/articleindex/article/_search
查询结果:
根据id查询: GET: http://localhost:9200/articleindex/article/[要查询的_id(前面不用加_search)]
根据title查询:GET: http://localhost:9200/articleindex/article/_search?q=title:es学习笔记
模糊查询: GET: http://localhost:9200/articleindex/article/_search?q=*es学习*
(模糊查询要给查询的词加上"*要模糊查询的词*")
4.修改
修改的时候要带上刚创建成功的"_id"
例如我们要修改刚创建的那一条数据:
PUT: http://localhost:9200/articleindex/article/AWYD_DQz08TyZe-Re1rv
请求体内容:
{
"title":"es学习笔记修改",
"content":"es修改"
}
返回结果:
注意:
如果修改的url的id后缀存在就是修改,否则视为新创建:http://localhost:9200/articleindex/article/[要修改或者创建的_id]
5.删除
例如删除_id为1的数据:
DELETE: http://localhost:9200/articleindex/article/1
返回结果:
Head插件
如果都是通过rest请求的方式使用es,未免太过麻烦,而且也不够人性化。我们一般会使用图形化界面来实现es的日常管理,最常用的就是Head插件。
下载解压
- 下载head插件:http://github.com/mobz/elasticsearch-head
- 下载elasticsearch-head-master.zip
- 解压到任意目录,但是要和es的安装目录区分开来。
- 安装node.js,安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 将grunt安装为全局命令。Grunt是基于Node.js的项目构建工具。他可以自动运行你所设定的任务。
npm install -g grunt-cli
- 安装依赖
进入Head插件的解压目录,根据该目录下的pakage.json安装依赖包
cnpm install
安装完成之后,你会发现该目录下会多一个node_modules包
- 启动
进入Head的解压目录启动Head,在命令提示符下输入命令
grunt server
- 访问
打开浏览器,输入http://localhost:9100
- 点击链接按钮没有任何反应,按F12发现有如下错误:
No ‘Access-Controller-Allow-Origin’ header is present on the requested resource
这个错误是由于es默认不允许跨域调用,而elasticsearch-head属于前端工具,所以报错。我们这个时候需要修改前端es的配置,让其允许跨域访问。
修改es的配置文件:elasticsearch.yml,增加以下两句命令:
http.cors.enabled:true
http.cors.allow-origin:"*"
此步为允许es跨域访问,点击链接即可看到相关信息。
Head工具使用
添加索引
查询
- 根据索引查询
- 新增、修改、删除
输入请求和之前在postman的增删改类似,请参考上面的描述。
ik分词器
ik分词器主要是用来对用户要搜索的文本按照一定的规则进行拆分
ik分词器安装
下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
- 将下载下来的压缩包进行解压,将解压后的elasitcsearch文件夹重命名为ik
- 将ik文件夹拷贝到elasticsearch/plugins目录下
- 重新启动es,即可加载IK分词器
ik分词器测试
ik提供了两个分词器算法:ik_smart和ik_max_word
其中ik_smart为最少切分,ik_max_word为最细粒度划分
我们分别来试一下:
- ik_smart:在浏览器地址栏输入地址
http://localhost:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
结果如下:
2. ik_max_word
在浏览器地址栏输入地址
http://localhost:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员
结果如下:
自定义词库
有时候会有一些网络用语新产生的词汇,就需要将新的词汇收录到es服务器,这时候就需要用到收录词条。
进入ik/config文件夹下,创建一个custom.dic文件,通过可保存文件为utf-8的文本编辑器打开,输入“人艰不拆”,保存。在同目录下打开IKAnalyzer.cfg.xml,在entry的ext_dice中输入新加的custom.dic,然后保存之后并进行重启es。
再重新在浏览器输入:
http://localhost:9200/_analyze?analyzer=ik_max_word&pretty=true&text=人艰不拆
此时分词器会将“人艰不拆”作为一个完整的词汇进行分词,而不是分为4个单独的词。
代码连接es
在POM.XML中添加
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
在application.yml中添加
spring:
data:
elasticsearch:
cluster-nodes:127.0.0.1:9300 #连接es的地址
创建相关实体类:
analyzer:分词的时候按这个算法分词(存储用的)
searchAnalyzer:搜索的时候按这个算法分词(搜索用的)
这两个一般值一样,确保按照分词能搜索到
创建相关dao层,注意继承ElasticsearchRepository接口就行
service层、controller层和一般代码无二。
Logstash
什么是Logstash?
Logstash是一个轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。
Logstash安装与测试
将Logstash压缩包解压,进入bin目录:
logstash -e 'input {stdin { }} output{stdout {} }'
控制台输入字符,随后就有日志输出。
Mysql数据导入Elasticsearch
- 在logstash-5.6.8安装目录下创建文件夹mysqletc
- 文件夹下创建mysql.conf(名称随意),内容如下:
再将mysql-connect-java的jar拷入同目录下。
input{
jdbc{
jdbc_connection_string=>"jdbc:mysql://127.0.0.1:3306/数据库名称?characterEncoding=utf-8"
jdbc_user=>"root"
jdbc_password=>"root"
jdbc_driver_library=>"当前路径下mysql-connect-java的jar包的完整限定名"
jdbc_driver_class=>"com.mysql.jdbc.Driver"
#是否分页
jdbc_paging_enabled=>"true"
#分页条数
jdbc_page_size=>"50"
#以下对应着要执行的sql的绝对路径
#statement_filepath=>""
statement=>"select id,其他字段 from 表名称"
#定时任务 各字段含义(由左至右)分、时、天、月、年,全部为*表示每分钟都更新
schedule=>"* * * * *"
}
}
output{
elasticsearch{
#ES的IP地址与端口
hosts => "127.0.0.1:9200"
#ES索引名称
index => "索引名称"
#自增id编号,这个id对应上面数据库sql查询出来的id
document_id=>"%{id}"
#es类型
document_type=>""
}
stdout{
#以json格式输出
codec => json_lines
}
}
然后命令提示符输入以下命令,执行该conf文件,将数据库内容导入es的索引库。
logstash -f 该文件的路径/mysql.conf
然后等待每分钟执行刷新一次数据便可。
docker安装ES
- 下载镜像:
docker pull elastcisearch:5.6.8
- 创建容器
docker run -di --name=容器名称 -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8
- 浏览器验证是否成功。
http://服务器url:9200
- es安装在服务器的时候,9200可用,9300如果宿主机没开启的话,一般是不可用的,那么如何解决9300不可用呢?
首先我们要进入docer创建的es容器,固定写法:
docker exec -it 容器名称 /bin/bash(内存中固定的路径,这样写就行)
要解决9300不能访问的问题就必须修改elasticsearch/config/elasticsearch.yml,但是在docker容器中是不能直接编辑(vi)的,所以必须用docker cp将该文件拷贝到宿主机,然后修改好之后再拷贝回去。
修改内容如下:
#意思是所有ip都可以访问,如果要限定只有某个ip可以访问,那么将其改为固定ip即可。
transport.host:0.0.0.0
- 开启了所有ip访问之后,会发现后台启动报错,启动不起来,这是什么原因呢?是因为宿主机软硬件、内存不能支撑。所以我们还需要系统调优。
我们一共需要修改两处地方:
5.1. 修改/etc/security/limits.conf,追加内容
* soft nofile 65536
* hard nofile 65536
nofile是单个进程允许打开的最大文件个数,softnofile是软限制,hard nofile是硬限制
5.2. 修改/etc/sysctl.conf,追加内容
vm.max_map_count=655360
限制一个进程可以拥有的VMA(虚拟内存区域)的数量
执行下面命令,修改内核参数马上生效
sysctl -p
注意: 复制上面的命令的时候,注意要将中文空格转换为英文的
- 重新启动虚拟机,再次启动容器,发现已经可以启动并远程访问
> reboot #重启虚拟机
> systemctl start docker #启动docker服务
> docker images #查看虚拟机上所有的docker镜像
> docker ps -a #查看虚拟机上 【已经运行/未运行】 的docker容器
> docker ps #查看虚拟机上已经运行的docker容器
docker安装ik分词器
将下载好的ik分词器使用docker命令复制到es的plugins文件夹中,参考上面的ik学习。
docker安装head插件
制作head镜像,运行。参考上面的head插件初学。