ElasticSearch

2020-08-22  本文已影响0人  _给我一支烟_

一、直接在虚拟机中搭建 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

  1. 新建一个索引(类似mysql新建一个数据库实例),在kibana Dev Tools 里面操作
    PUT 索引名

查看现有的索引
http://192.168.121.223:9200/_cat/indices?v

  1. 创建表并插入一条数据
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}
  ]
}
  1. 简单的查询
    查所有
GET my_indnx/moive/_search

匹配查询

GET my_indnx/moive/_search
{
  "query": {
    "match": {
      "moive_name": "red event"
    }
  }
}
  1. 删除一条数据
DELETE my_indnx/moive/2
  1. 修改一条数据,与插入一条数据一样直接改里面的值即可,不用改的字段和数据也要带上否则那些字段会被删掉
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 整合

一般来说有两种方式:

  1. Jest(默认不生效,需要下载依赖包)

添加依赖

<dependency>
    <groupId>io.searchbox</groupId>
    <artifactId>jest</artifactId>
    <version>6.3.1</version>
</dependency>
  1. 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

上一篇下一篇

猜你喜欢

热点阅读