这篇教程主要是对在入门的elasticsearch的一个记录。
ES 集群安装
安装环境
基于 Dokcer ,单机安装 Docker 版集群。使用版本如下:
- Elasticsearch 5.3.2
- Kibana 5.3.2
- JDK 8
整个安装步骤分成三部分:
- 安装 ES 集群实例 elasticsearch001
- 安装 ES 集群实例 elasticsearch002
- 安装 Kibana 监控
安装 ES 集群实例
安装过程中镜像拉取事件过长,这里笔者将docker镜像上传到阿里的docker仓库中。
安装 ES 集群实例 elasticsearch001:
docker run -d -p 9200:9200 \
-p 9300:9300 \
--name elasticsearch001 -h elasticsearch001 \
-e cluster.name=lookout-es \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-e xpack.security.enabled=false \
registry.cn-hangzhou.aliyuncs.com/dingwenjiang/elasticsearch:5.3.2
命令解释如下:
-
docker run
: 会启动一个容器实例,如果本地没有对应的镜像会去远程registry上先下载镜像。 -
-d
: 表示容器运行在后台 -
-p [宿主机端口]:[容器内端口]
: 比如-p 9200:9200
表示把宿主机的9200端口映射到容器的9200端口 -
--name
: 设置容器别名 -
-h
: 指定容器的hostname -
-e
: 设置环境变量。这里关闭 x-pack 的安全校验功能,防止访问认证。
通过curl http://localhost:9200/_cat/health?v=pretty
来验证elasticsearch001是否启动成功,如下:
设置环境变量的时候,我们指定了-e cluster.name=lookout-es
,用于后续关联集群用。node为1 表示只有一个实例。默认 shards 分片为主备两个。status 状态是我们要关心的,状态可能是下列三个值之一:
- green:所有的主分片和副本分片都已分配,集群是 100% 可用的。
- yellow:所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。高可用会弱化把 yellow 想象成一个需要及时调查的警告。
- red:至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
也可以访问 http://localhost:9200/ ,可以看到成功运行的案例,返回的 JSON 页面。如图:
继续搭建elasticsearch002:
docker run -d -p 9211:9200 \
-p 9311:9300 --link elasticsearch001 \
--name elasticsearch002 \
-e cluster.name=lookout-es \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-e xpack.security.enabled=false \
-e discovery.zen.ping.unicast.hosts=elasticsearch001 \
registry.cn-hangzhou.aliyuncs.com/dingwenjiang/elasticsearch:5.3.2
启动elasticsearch002的时候增加了几个参数,
-
--link [其他容器名]:[在该容器中的别名]
: 添加链接到另一个容器, 在本容器 hosts 文件中加入关联容器的记录。 -
-e
: 设置环境变量。这里额外指定了 ES 集群的 cluster.name、ES 集群节点淡泊配置 discovery.zen.ping.unicast.hosts 设置为实例 elasticsearch001。
再次执行curl http://localhost:9200/_cat/health?v=pretty
,结果如图:
对比上面检查数值可以看出,首先集群状态为 green , 所有的主分片和副本分片都已分配。你的集群是 100% 可用的。相应的 node 、shards 都增加。
安装 Kibana 监控
接着安装Kibana,对elasticsearch进行监控,安装命令如下:
# 启动kibana
docker run -d --name kibana001 \
--link elasticsearch001 \
-e ELASTICSEARCH_URL=http://elasticsearch001:9200 \
-p 5601:5601\
registry.cn-hangzhou.aliyuncs.com/dingwenjiang/kibana:5.3.2
其中-e 设置环境变量。这里额外指定了 ELASTICSEARCH_URL 为搜索实例地址。打开网页访问 127.0.0.1:5601,默认账号为 elasti,密码为 changeme。会出现如下的截图:
Spring Boot 整合 Elasticsearch
这里只是简单整合下,开发一个web接口,实现数据存储以及查询功能。开发的思路还是传统的三层架构,controller、service、dao,这里利用spring data来简化对es的curd操作。
项目的repo地址:https://github.com/warjiang/d...
整个项目的结构如下所示:
入口文件为:Application类,其中也是大家熟悉的spring-boot的用法。
controller主要在api包下,这里会暴露出两个API接口,分别是/api/contents
用于写入内容、/api/content/search
用于查询
service主要在service包下,与controller对应,需要实现写入和查询两个方法
dao主要在repository包下,继承ElasticsearchRepository,实现curd。
这里需要注意的时候,读写的bean用的是entity包下的ContentEntity,实际上services中操作的的bean是bean包下的ContentBean。
后续具体的实现在这里不再赘述。
项目运行起来后,可以发送写入和查询的请求来测试功能的正确性。
写入请求:可以通过curl 或者postman构造一个请求如下:
POST /api/contents HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
Cache-Control: no-cache
[
{
"id":1,
"title":"《见识》",
"content":"摩根说:任意让小钱从身边溜走的人,一定留不住大钱",
"type":1,
"category":"文学",
"read":999,
"support":100
},
{
"id":2,
"title":"《态度》",
"content":"人类的幸福不是来自偶然的幸运,而是来自每天的小恩惠",
"type":2,
"category":"文学",
"read":888,
"support":88
},
{
"id":3,
"title":"《Java 编程思想》",
"content":"Java 是世界上最diao的语言",
"type":2,
"category":"计算",
"read":999,
"support":100
}
]
请求成功会返回如下所示:
{
"code": 0,
"message": "success",
"data": true
}
写入成功后可以到kibana中查看写入结果,打开网页访问 localhost:5601,在 Kibana 监控中输入需要监控的 index name 为 content
。如下图,取消打钩,然后进入:
进入后,会得到如图所示的界面,里面罗列了该索引 content 下面所有字段:
打开左侧 Discover 栏目,即可看到可视化的搜索界面及数据:
随便打开一个json如下:
{
"_index": "content",
"_type": "content",
"_id": "2",
"_score": 1,
"_source": {
"id": 2,
"title": "《态度》",
"content": "人类的幸福不是来自偶然的幸运,而是来自每天的小恩惠",
"type": 2,
"category": "文学",
"read": 888,
"support": 88
}
}
- _index 就是索引,用于区分文档成组,即分到一组的文档集合。索引,用于存储文档和使文档可被搜索。
- _type 就是类型,用于区分索引中的文档,即在索引中对数据逻辑分区。比如索引 project 的项目数据,根据项目类型 ui 项目、插画项目等进行区分。
- _id 是该文档的唯一标示,代码中我们一 ID 作为他的唯一标示。
查询请求:可以通过curl 或者postman构造一个请求如下:
POST /api/content/search HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
Cache-Control: no-cache
{
"searchContent":"Java",
"type":2,
"pageSize":3,
"pageNumber":0
}
对应结果如下:
{
"code": 0,
"message": "success",
"data": {
"pageNumber": 0,
"pageSize": 3,
"totalPage": 1,
"totalCount": 1,
"result": [
{
"id": 3,
"title": "《Java 编程思想》",
"content": "Java 是世界上最diao的语言",
"type": 2,
"category": "计算",
"read": 999,
"support": 100
}
]
}
}
这里根据 searchContent 匹配短语 +type 匹配单个字段,一起构建了搜索语句。用于搜索出我们期待的结果,就是《Java 编程思想》。