elasticsearch入门

CodeCosmicAegis
• 阅读 2373

这篇教程主要是对在入门的elasticsearch的一个记录。

ES 集群安装

安装环境

基于 Dokcer ,单机安装 Docker 版集群。使用版本如下:

  • Elasticsearch 5.3.2
  • Kibana 5.3.2
  • JDK 8

整个安装步骤分成三部分:

  1. 安装 ES 集群实例 elasticsearch001
  2. 安装 ES 集群实例 elasticsearch002
  3. 安装 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是否启动成功,如下:
elasticsearch入门
设置环境变量的时候,我们指定了-e cluster.name=lookout-es,用于后续关联集群用。node为1 表示只有一个实例。默认 shards 分片为主备两个。status 状态是我们要关心的,状态可能是下列三个值之一:

  • green:所有的主分片和副本分片都已分配,集群是 100% 可用的。
  • yellow:所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。高可用会弱化把 yellow 想象成一个需要及时调查的警告。
  • red:至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。

也可以访问 http://localhost:9200/ ,可以看到成功运行的案例,返回的 JSON 页面。如图:

elasticsearch入门

继续搭建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,结果如图:
elasticsearch入门

对比上面检查数值可以看出,首先集群状态为 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。会出现如下的截图:

elasticsearch入门

Spring Boot 整合 Elasticsearch

这里只是简单整合下,开发一个web接口,实现数据存储以及查询功能。开发的思路还是传统的三层架构,controller、service、dao,这里利用spring data来简化对es的curd操作。
项目的repo地址:https://github.com/warjiang/d...

整个项目的结构如下所示:
elasticsearch入门

入口文件为: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。如下图,取消打钩,然后进入:
elasticsearch入门

进入后,会得到如图所示的界面,里面罗列了该索引 content 下面所有字段:
elasticsearch入门

打开左侧 Discover 栏目,即可看到可视化的搜索界面及数据:
elasticsearch入门

随便打开一个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 编程思想》。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(