一、直接在虚拟机中搭建 elasticsearch 环境
1.运行需要 JAVA 环境
2.elasticsearch 下载地址
https://www.elastic.co/cn/downloads/past-releases#elasticsearch
问题1: 下载后解压可能起不来:注意两点,1.不要用root用户启动,2.不要放在root家目录下面
创建elsearch用户组及elsearch用户:
groupadd elsearch
useradd elsearch -g elsearch
passwd elsearch
更改elasticsearch文件夹及内部文件的所属用户及组为elsearch:elsearch
cd /opt
chown -R elsearch:elsearch elasticsearch-6.8.8
切换到elsearch用户再启动
su elsearch
cd /opt/elasticsearch-6.8.8/bin
./elasticsearch
问题2: 每个进程最大同时打开文件数太小
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
修改 /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
执行命令 sysctl -p 生效
问题3: elasticsearch用户拥有的内存权限太小,至少需要262144
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
执行命令:
sysctl -w vm.max_map_count=262144
或修改 /etc/sysctl.conf
vm.max_map_count=262144
问题4: 外部浏览器无法访问
修改配置文件 elaticsearch.yml 里面的
network 0.0.0.0
上面问题都解决了再次启动,并验证是否启动成功
查看es健康状态:
curl http://localhost:9200/_cat/health?v
在浏览器上输入
ip:9200 查看是否有json串出来
3.kibana
https://www.elastic.co/cn/downloads/past-releases/kibana-6-8-8
修改kibana.yml配置,让其找到es的地址
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
启动
cd bin
nohup ./kibana &
4.分词
有两种下载安装方式
- 使用插件命令下载
cd /opt/elasticsearch-6.8.8/bin
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.8/elasticsearch-analysis-ik-6.8.8.zip
- 手动下载拷贝
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v6.8.8
下载elasticsearch-analysis-ik-6.8.8.zip包,在win下解压zip包
cd /opt/elasticsearch-6.8.8/plugins
mkdir ik
把win解压的zip里面内容 拷贝到 ik目录下
重启 elasticsearch
二、在docker中搭建 elasticsearch 环境
先在虚拟机中安装docker,参见docker教程:
出现 docker0: iptables: No chain/target/match by that name 错误
解决:重启docker
service docker restart
docker 下载镜像仓库地址:https://hub.docker.com/
1.安装 elasticsearch
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.8.8
2.启动es容器
写个启动esRun.sh的启动脚本内容如下:
docker run -itd --name elasticsearch -v /docker/esdata:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.8.8
说明几点
不要加 -rm 参数 这样重启后该容器会删除,在里面装的分词插件就没有了
加 -v /docker/esdata:/usr/share/elasticsearch/data 把容器里的数据映射到本地这样可以写到磁盘永久保存,另外esdata权限改成777
在浏览器中输入: 虚拟机ip:9200 验证,有json串返回说明启动成功
3.进入到es容器中安装ik分词器插件
docker exec -it elasticsearch /bin/bash
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.8/elasticsearch-analysis-ik-6.8.8.zip
4.修改配置,解决跨域访问问题
首先进入到容器中,然后进入到指定目录修改elasticsearch.yml文件。
docker exec -it elasticsearch /bin/bash
cd /usr/share/elasticsearch/config/
vi elasticsearch.yml
在elasticsearch.yml的文件末尾加上:
http.cors.enabled: true
http.cors.allow-origin: "*"
修改配置后重启容器即可。
docker restart elasticsearch
5.安装 kibana
docker pull kibana:6.8.8
6.连接es并启动
写个kibanaRun.sh脚本内容如下:
docker run -itd --rm --name kibana --link=elasticsearch:test -p 5601:5601 kibana:6.8.8 && docker start kibana
在浏览器中输入: 虚拟机ip:5601 验证,出现kibana界面
问题1:
docker : 报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
解决方法:
vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
systemctl restart network
三、elasticsearch
- 新建一个索引(类似mysql新建一个数据库实例),在kibana Dev Tools 里面操作
PUT 索引名
查看现有的索引
http://192.168.121.223:9200/_cat/indices?v
- 创建表并插入一条数据
PUT my_indnx/moive/2
{
"moive_name": "red event",
"price":120,
"time":"2018-11-10",
"actors":[
{"name": "zhaosi", "age":33, "sex":1},
{"name": "achen", "age":43,"sex":1},
{"name": "wangwu","age":23,"sex":2}
]
}
- 简单的查询
查所有
GET my_indnx/moive/_search
匹配查询
GET my_indnx/moive/_search
{
"query": {
"match": {
"moive_name": "red event"
}
}
}
- 删除一条数据
DELETE my_indnx/moive/2
- 修改一条数据,与插入一条数据一样直接改里面的值即可,不用改的字段和数据也要带上否则那些字段会被删掉
PUT my_indnx/moive/2
{
"moive_name": "red event",
"price":333,
"time":"2018-11-10",
"actors":[
{"name": "zhaosi", "age":33, "sex":1},
{"name": "achen", "age":43,"sex":1},
{"name": "wangwu","age":23,"sex":2}
]
}
在Elaticsearch 6.x版本中已经只允许一个索引下只有一个type,声明多个type已经标记为过期
复合查询
GET my_indnx_2/moive_2/_search
{
"query": {
"bool": {
"must": [
{"match": {
"moive_name": "行动"
}}
],
"filter":{
"term": {
"moive_gsid": "3"
}
}
}
}
}
在新建index下的type表结构时,指定将来可能使用分词器的字段
ik分词器主要有两个
ik_smart:简单分词器,将以最小的组合拆分中文
ik_max_word:最大化分词器,将以最大化结果分词
GET _analyze
{
"text": "我是中国人",
"analyzer": "ik_max_word"
}
四、springboot 与 elasticsearch 整合
一般来说有两种方式:
- Jest(默认不生效,需要下载依赖包)
添加依赖
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>6.3.1</version>
</dependency>
- spring data (创建项目勾选了 NoSQL中的elasticsearch会自动添加依赖)
ElasticsearchRepository 和 ElasticsearchTemplate 两种
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
jest 这种方式的查询需要拼json的查询语句,不是很方便
ElasticsearchRepository 可以做Elasticsearch的相关增删改查,用法和普通的CRUDRepository是一样的,
这样就能统一ElasticSearch和普通的JPA操作,获得和操作mysql一样的代码体验。但是同时可以看到
ElasticsearchRepository的功能是比较少的,简单查询够用。
ElasticsearchTemplate 则提供了更多的方法来完成更多的功能,也包括分页之类的,他其实就是一个封装
好的ElasticSearch Util功能类,通过直接连接client来完成数据的操作。
使用 ElasticsearchRepository 查询的时候报
ElasticsearchException:failed to map source [xxx to class Book] with root cause 错误
原因:
这是因为在实体类Book中为了方便实例化添加了一个有参构造函数,导致JVM不能添加默认的无参构造函数了,但是jackson的反序列化需要使用无参构造函数,所以报错!
解决:
在实体类Book中添加一个无参构造函数就可以了!
或者不写构造函数直接添加两个注解 @NoArgsConstructor @AllArgsConstructor