安装ElasticSearch 是目前很是流行的搜索引擎,对海量数据搜索是很是友好,而且在高并发场景下,也能发挥出稳定,快速特色。也是大数据和索搜服务的开发人员所极力追捧的中间件。虽然 ElasticSearch 深受你们的喜好,可是它的迭代速度之快,因此在相关社区总是有据说到学不动了的话语,也正是这种不断完善,才能拥有如今的社区活跃。我使用 ElasticSearch 时,从 5.x 到 6.x 版本,再到如今接触到 7.x 版本。从版本升级中,也看到了 ElasticSearch 对主流技术变化的拥抱,最明显的是新版 JDK 版本的支持及容器技术的支持。php
本文基于目前最新版本 ElasticSearch-7.5.0
进行操做,如官网下载太慢,可在【ytao公众号】中发送 es
获取下载连接。html
安装环境及本文相关包:node
操做系统 CentOS7.564位
vim
ElasticSearch7.5.0
api
Kinbana7.5.0
bash
ElasticSearch 在 7.x 中自带 JDK 环境,因此如今不必定要安装 JDK。默认是先判断当前服务器是否安装 JDK,若是安装了就使用服务器已安装的 JDK,不然会使用自带的 JDK,固然这个也是能够手动设置。服务器
因为 ElasticSearch 默认是不支持 root 帐号权限启动,因此第一步要先建立启动帐号。建立一个 ElasticSearch 的运行组 es:并发
groupadd es
app
在 es 组中建立用户:jvm
useradd elastic -g es
设置新用户密码:
passwd elastic
给解压出的 ElasticSearch 包受权:
chown -R elastic:es elasticsearch-7.5.0
进入到 /elasticsearch-7.5.0
目录,在 config
目录里有个 elasticsearch.yml
文件,修改里面当前须要的配置。
cluster.name 是所属集群的名称
node.name 当前节点名称
network.host 当前节点所绑定地址,绑定到 0.0.0.0
全部的访问
http.port 对外提供服务的端口号
path.data 数据存储目录,这个我通常不适用默认目录,可是要给自定义的目录受权
path.log 日志目录,和 path.data 相似配置
另一个重要的配置,在当前目录中的 jvm.options
文件设置。这里设置堆内存大小,建议设置机器内存的 50% 大小。
-Xms4g
-Xmx4g
其余配置暂时没用到,暂不分析,从此的文章中用到再进行讲解。
安装配置文件设置的值默认启动,直接执行 ./bin/elasticsearch
,果真不出乎所意料,启动异常。
上图中抛了两个异常。
第一个是说虚拟内存过小,至少须要 262144。
第二个当前默认配置不适合,[discovery.seedhosts, discovery.seedproviders, cluster.initialmasternodes]配置中至少有一个配置。
如今就增大服务器虚拟内存:
# 编辑 sysctl.conf 文件 vim /etc/sysctl.conf # 在 sysctl.conf 中添加 vm.max_map_count=262144 # 查看刚设置的是否生效 sysctl -p
设置 cluster.initialmasternodes 配置参数:
cluster.initial_master_nodes: ["node-1"]
再次启动完成后,没有异常抛出,访问 ip:9200
,返回数据信息,其中包括集群名称,节点名,版本信息等等:
在进行 API 操做前先安装 kibana,如下命令执行将所有在 kibana 中执行。解压 kibana 后,在 kibana.yml
中设置 ElasticSearch 地址 elasticsearch.hosts:["http://ip:9200"]
。经过 bin/kibana
进行启动。安装比较简单,这里不作详细阐述。
建立 person 索引例子,numberofshards 为分片数量,numberofreplicas 为索引的副本数,这里主要演示建立索引时可设置一些相关参数,且为非必填项。
PUT /person { "mappings": { "properties": { "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256// 长度超过ignore_above设定的值,不会被索引或存储 } } } } }, "settings": { "number_of_shards": 1, "number_of_replicas": 1 } }
执行命令结果:
使用 GET 请求方式查询索引信息:
GET /person
返回结果
使用 DELETE 请求方式:
# 删除 person 索引 DELETE /person # 删除所有索引 DELETE /_all # 通配符删除 DELETE /person*
查询 person 索引的 mapping :
GET /person/_mapping
向 person 索引中添加 remark 字段,以前 mapping 中的 name 不会被删除,。
POST /person/_mapping { "properties": { "remark2": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }
添加文档有两种方式,第一种就是使用指定索引的 type 添加文档,7.x开始,type 指定只能是 _doc 值,同时也是不支持多 type 的(ps:以前使用type主要用来将索引逻辑分区)。第二种就是使用 _create 进行建立数据。
使用 _doc
API向 person 中添加文档:
PUT /person/_doc/1 { "name":"ytao", "blog":"公众号 ytao", "remark":"https://ytao.top" }
添加文档后返回的数据:
上面命令执行过程,若是索引或 mapping 不存在,都会自动建立。这里的 id 咱们也能够自动生成,可是请求不能使用 PUT 方式,要改成 POST 方式。
POST /person/_doc/ { "name":"ytao", "blog":"公众号 ytao", "remark":"https://ytao.top" }
若是上面咱们插入 id 为 1 的文档重复执行,那么会先删除掉旧的文档,再引用新的文档,而且所对应的 _version
版本号值会较以前的 +1。
使用 _create
API向 person 添加文档:
PUT /person/_create/2 { "name":"yangtao", "blog":"ytao's blog", "remark":"coder" }
这里 id 必须指明,不然添加失败,而且文档中已存在的 id 不能进行添加。
使用 GET 获取文档:
GET /person/_doc/1
返回数据中:
使用 _search
API进行查询,这里暂时不作深刻讲解。查询 name 为 ytao 的文档,而且经过 from=0&size=2
分页查询。
# q 为查询参数,查询的字段和值用 : 进行分割
GET /person/_search?q=name:ytao&from=0&size=2
返回结果:
更新文档使用 _update
API进行更新。更新内容必须包含在 doc
中。更新对源数据只能是添加或修改字段,这也是和使用 _doc
添加数据的区别,不是经过删除旧的文档进行更新的。
POST /person/_update/1 { "doc":{ "blog":"ytao's blog" } }
文档删除使用 DELETE 请求,而后指定 id:
DELETE /person/_doc/1
批量处理能够一次请求中处理多个任务,使用 _bulk
API进行。下面就以索引添加方式添加一个文档到索引中,而后更新文档中 blog 字段为例。
POST _bulk {"index":{"_index":"person", "_id":1}} {"name":"ytao","blog":"公众号 ytao","remark":"https://ytao.top"} {"update":{"_index":"person", "_id":1}} {"doc":{"blog":"ytao's blog"}}
返回结果中,按每个操做分别返回结果信息,当其中有请求错误时,不会影响其余请求操做。
批量获取文档,使用 _mget
API进行,经过一次指定多个文档 id,进行请求。例如在 person 索引中获取 id 为 1,2 的文档:
POST _mget { "docs":[ { "_index": "person", "_id": 1 }, { "_index": "person", "_id": 2 } ] }
返回结果:
批量查询文档,使用 _msearch
API进行,将多个查询整合到一个请求中。下面就是分别在指定索引中查询的不一样条件。
GET /person/_msearch {"index":"person"} {"query":{"match":{"blog":"ytao's blog"}}} {"index":"person"} {"query":{"match":{"remark":"coder"}}}
返回结果:
本文对 ElasticSearch 的最基础的,经常使用的操做 API,这里已经介绍完毕。要想学习 ElasticSearch,建议从 API 操做入手,千万别上来就直接拿着代码就干,虽然各语言都已提供相关工具包,可是这些封装也都是基于 API 上的。更多的 API 在从此文章涉及时再进行分析。
更多 API 相关信息,建议查阅官网,这里有比较详细的介绍:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/rest-apis.html
-END-