Elasticsearch快速入门和环境搭建
内容概述
本文内容主要集中在应用层,通过下面几个部分介绍当前最流行的搜索工具:Elasticsearch,了解这些内容后,可以快速开始使用它。
- 什么是
Elasticsearch,为什么要使用它? - 基础概念:节点,索引,类型映射和文档
- 本地环境搭建,创建第一个
index - 常用
RESTful Api示例
什么是Elasticsearch,为什么要使用它?
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎。
它基于Lunece实现,使用java语言编写。Lunece是一个优秀的搜索引擎库,但它使用起来非常复杂。
Elasticsearch通过对 Lunece的封装,隐藏了复杂性,提供了使用简单的RESTful Api。
同时也实现了分布式集群特性,具有存储数据大,查询性能好,扩展方便等特点。
为什么要使用它
在业务开发中,基于ES的特性,通常有下面这些场景需要使用它:
- 存储大量数据。通过在使用mysql存储的时候,数据的单位是
G。使用ES的时候,数据的单位是T。由此可以看出ES使用于大数据量的存储场景,基于分布式特性,它也支持备份和容灾,并且可以很容易水平扩展容量。 - 分词搜索引擎。ES具有强大的分词能力,可以支持高性能的实时搜索。
- 高效数据分析。ES提供的聚合分析功能,可实现对保存的大量数据的近实时统计分析。
基础概念简介
要使用ES,需要了解几个最基本的概念,节点(node),索引(index),类型映射(mapping)和文档(doc)。
节点(node)
节点是组成ES集群的基本单位,每个节点是一个运行的ES实例。每个物理机器上可以有多个节点,使用不同的端口和节点名称。
节点按主要功能可以分为三种:主节点(Master Node),协调节点(Coordianting Node)和数据节点(Data Node)。下面简单介绍下:
- 主节点:处理创建,删除索引等请求,维护集群状态信息。可以设置一个节点不承担主节点角色
- 协调节点:负责处理请求。默认情况下,每个节点都可以是协调节点。
- 数据节点:用来保存数据。可以设置一个节点不承担数据节点角色
索引(index)
索引是ES中的逻辑概念,是文档的容器。对ES的操作,基本都是对索引操作,一个ES集群中,可以创建多个索引。
索引定义了一组文档的数据模型和处理方法。每个索引可以有多个主分片和副本分片,分别保存在不同的节点。
- 主分片的作用是对索引的扩容,使一个索引的容量可以突破单机的限制。
- 副本分片是对数据的保护,每个主分片对应一个或多个副本分片,当主分片所在节点宕机时,副本分片会被提升为对应的主分片使用。
- 一个主分片和它的副本分片,不会分配到同一个节点上。
- 一个索引的分片数在创建时指定,如果要修改需要重建索引,代价很高。
类型映射(mapping)
mapping定义了一个索引中,文档保存的每个字段的数据类型。根据数据类型的不同,在添加文档时对每个字段的处理也不同。
例如,对text类型的字段,会先使用分词器分词,生成倒排索引,用于之后的搜索。对keyword类型的字段,不会分词,搜索时只能精确查找。
一个简单的mapping示例如下:
{
"javalogs": { //索引名称
"mappings": {
"properties": {
"log_content": { //text类型,分词,用于之后的分词索引
"type": "text"
},
"date": {//时间类型
"type": "date"
},
"log_level": { //keyword类型,不分词
"type": "keyword"
},
"ip": {
"type": "keyword"
}
}
}
}
}
在6.x版本中,每个索引中还可以有多个type,区分不同的mapping。在7.x中,type被取消,每个索引只有一个type:_doc
文档(doc)
文档是
Elasticsearch中的最小单位,每个索引都是有数量众多的文档组成的。文档中包含多个字段,每个字段的类型由
mapping定义。在一个索引中每个文档都有一个唯一id,可以在添加时指定,也可以自动生成。
下面通过一张图来描述,节点(node),索引(index)和文档(doc)之间的关系。

本地环境搭建,创建第一个index
一切知识都要通过实践掌握,所以在了解基本的概念和逻辑后,下面就进入实践环节。
这里推荐使用docker来搭建本地开发环境,docker对应windows和mac系统都有桌面版本,使用非常方便。因为网络限制,直接使用docker官方仓库拉取镜像会很慢,所以在安装完成后,需要在设置中将仓库的地址替换为国内源,这里推荐https://docker.mirrors.ustc.edu.cn,速度很快,设置如下:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
]
}

下面我们使用docker安装Elasticsearch和kibana镜像,kibana是es官方配套的可视化分析工具,使用它的页面dev tools可以很方便的通过api操作es。
因为要同时部署两个docker镜像,这里推荐使用docker-composer,桌面版安装完成后就带有该命令,需要的配置如下:
services:
kibana:
image: kibana:7.2.0
container_name: kibana-simple
environment:
- TIMELION_ENABLED=true
ports:
- "5601:5601"
networks:
- mynetwork
elasticsearch:
image: elasticsearch:7.2.0
container_name: es-simple
environment:
- cluster.name=mytestes #这里就是ES集群的名称
- node.name=es-simple #节点名称
- bootstrap.memory_lock=true
- network.publish_host=elasticsearch #节点发布的网络名称
- discovery.seed_hosts=es-simple #设置集群中的主机地址
- cluster.initial_master_nodes=es-simple #手动设置可以成为master的节点集合
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/local/elasticsearch/simpledata
ports:
- 9200:9200
networks:
- mynetwork
volumes:
esdata1:
driver: local
networks:
mynetwork:
driver: bridge
创建一个名称为docker-compose.yaml文件,复制下面的配置到文件中,然后再文件所在目录执行docker-compose up,之后会启动两个docker实例,分别是elasticsearch和kibana。
在本地浏览器中,访问http://127.0.0.1:5601/,可以看到kibana的界面如下:

创建好的kibana已经默认添加了Elasticsearch的配置,通过管理工具可以很方便的查看ES集群的状态,索引情况,删除索引等。

下面通过dev tools创建索引,dev tools提供的命令提示很方便,并且可以把已写好的请求保存在浏览器缓存中,非常适合用来学习Elasticsearch。

这里通过ES提供的RESTful Api创建了第一个索引, 并且设置了该索引中的mapping,ES的地址已经设置过,这里可以不写完整的域名,对应的curl完整请求如下:
curl --location --request PUT 'http://127.0.0.1:9200/javalogs' \
--header 'Content-Type: application/json' \
--data-raw '{
"mappings": {
"properties": {
"log_content": {
"type": "text"
},
"date": {
"type": "date"
},
"log_level": {
"type": "keyword"
},
"ip": {
"type": "keyword"
}
}
}
}'
常用RESTful Api示例
下面介绍下Elasticsearch中常用的api,这些例子都是直接在kibana的dev tools中运行的,如果想用curl访问,可参考前一节中的转换例子。
新增文档
//自动生成_id
POST javalogs/_doc
{
"log_content" : "get user_id 123456",
"date" : "2020-04-15T11:09:08",
"log_level": "info",
"ip": "10.223.32.67"
}
//指定_id
POST javalogs/_doc/111
{
"log_content" : "api response in 55ms",
"date" : "2020-04-15T11:09:07",
"log_level": "info",
"ip": "10.223.32.67"
}
查询文档-不分词类型
ES在文档查询时,对于不分词的查询,直接按值查询即可,例如下面这样:
//不分词类型查询
POST javalogs/_search
{
"query": {
"match": {
"ip": "10.223.32.67"
}
}
}
查询文档-分词类型
这里主要说下分词类型的查询,对于分析类型的field在查询时,也会默认把查询的语句分词。假设有两个文档如下:
//文档1
{
"log_content" : "call aaa service error",
"date" : "2020-04-15T11:09:07",
"log_level": "error",
"ip": "10.223.32.67"
}
//文档2
{
"log_content" : "call bbb service error",
"date" : "2020-04-15T11:09:08",
"log_level": "error",
"ip": "10.223.32.67"
}
当搜索条件为call aaa service时,实际上会把两个文档都搜索出来。
这是因为在搜索时,条件call aaa service会被分词为call,aaa和service,所有包含这三个词的文档都会被搜索出来,例如下面:
//普通搜索,两个文档都会返回
POST javalogs/_search
{
"query": {
"match": {
"log_content": "call aaa service"
}
}
}
那如果想要只搜索包含call aaa service的文档,应该如何做呢?
按照上面的分析,需要同时包含这三个词,并且按照给定的顺序,才返回对应的文档,那么这个可以使用match_phrase实现,示例如下:
//文档必须同时包含三个词,并且顺序与搜索条件一致才会返回。这里只会返回-文档1
POST javalogs/_search
{
"profile": "true",
"query": {
"match_phrase": {
"log_content": "call aaa service"
}
}
}
那如果条件是包含call,aaa和service,但是不一定是连着的,该如何搜索呢?可以使用operator操作符实现。
例如有第三个文档如下:
//文档3
{
"log_content" : "call inner aaa service error",
"date" : "2020-04-15T11:09:08",
"log_level": "error",
"ip": "10.223.32.67"
}
要想把文档1和文档2都搜索出来,查询的示例如下:
//文档中同时包含call,aaa和service就会返回,不按顺序。会返回-文档1和文档2
POST javalogs/_search
{
"query": {
"match": {
"log_content":
{
"query": "call aaa service",
"operator": "and"
}
}
}
}
上面就是对Elasticsearch的简单介绍和实战操作示例,希望能帮助大家快速入门使用ES。
以上内容属个人学习总结,如有不当之处,欢迎在评论中指正
Elasticsearch快速入门和环境搭建的更多相关文章
- 【个人笔记】003-PHP基础-01-PHP快速入门-03-PHP环境搭建
003-PHP基础-01-PHP快速入门 03-PHP环境搭建 1.客户端(浏览器) IE FireFox CHROME Opera Safari 2.服务器 是运行网站的基本 是放置程序代码的地方 ...
- JAVA WEB快速入门之环境搭建
前言 我是一直致力于:.NET技术栈.WEB前端.架构设计相关的开发与管理工作,但因国内大环境影响及公司技术方向发生转变(由.NET全部转为JAVA),需要熟练掌握JAVA WEB相关的知识,故我也得 ...
- Yocto开发笔记之《快速入门,环境搭建 & 编译》(QQ交流群:519230208)
开了一个交流群,欢迎爱好者和开发者一起交流,转载请注明出处. QQ群:,为避免广告骚扰,申请时请注明 “开发者” 字样 ======================================== ...
- 总结Vue 第四天:vue-cli(Vue2.0 新手入门 — 从环境搭建到发布)
总结Vue 第四天:vue-cli(Vue2.0 新手入门 - 从环境搭建到发布) 一.Vue CLI----(Vue2.0 新手入门 - 从环境搭建到发布): ■ CLI是Command-Lin ...
- 分布式搜索ElasticSearch单机与服务器环境搭建
从上方插件官网中下载适合的dist包,然后解压.进入bin目录,可以看到一堆sh脚本.在bin目录下创建一个test.sh: bin=/home/csonezp/Dev/elasticsearch-j ...
- Android入门之环境搭建
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1376935560.html 原创:An ...
- scala 入门Eclipse环境搭建
scala 入门Eclipse环境搭建及第一个入门经典程序HelloWorld IDE选择并下载: scala for eclipse 下载: http://scala-ide.org/downloa ...
- Elasticsearch简单使用和环境搭建
Elasticsearch简单使用和环境搭建 1 Elasticsearch简介 Elasticsearch是一个可用于构建搜索应用的成品软件,它最早由Shay Bannon创建并于2010年2月发布 ...
- 新手嘛,先学习下 Vue2.0 新手入门 — 从环境搭建到发布
Vue2.0 新手入门 — 从环境搭建到发布 转自:http://www.runoob.com/w3cnote/vue2-start-coding.html 具体文章详细就不搬了,步骤可过去看,我这就 ...
随机推荐
- k8s 安装 rabbitMQ 单机版
rabbitMQ docker镜像使用rabbitmq:3.8-management service.yaml文件 apiVersion: v1 kind: Service metadata: nam ...
- Servlet与Netty横向对比
为什么要把这两个看起来不是很搭的东西放在一起对比呢?首先它们两个都是网络编程框架和规范,而且通过我的观察,从API的设计.生命周期方法.处理流程等等方面,他们确实有太多相似的地方了,如果想要深入地学习 ...
- composer PSR规范
什么是PSR PSR 是 PHP Standard Recommendations (PHP 推荐标准)的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准. PHP FI ...
- RF-获取body
一个很简单的场景:GET方法获取某URL的body信息,直接读取即可,不做处理 *** Test Cases *** GetToken Create HTTP Context host=192.168 ...
- 从苏宁电器到卡巴斯基第14篇:我在苏宁电器当营业员 VI
我也过了一把讲师的瘾 由于iPhone已经成为了我们的主推产品,因此苏宁要求手机专区的每一个人,不论是自营还是厂促,都要对iPhone非常了解才可以.于是,督导也没有事先通知我,就直接让我给手机专区的 ...
- MySQL UDF提权执行系统命令
目录 UDF UDF提权步骤 UDF提权复现(php环境) UDF UDF (user defined function),即用户自定义函数.是通过添加新函数,对MySQL的功能进行扩充,其实就像使用 ...
- Win64 驱动内核编程-20.UnHook SSDT
UNHOOK SSDT 要恢复 SSDT,首先要获得 SSDT 各个函数的原始地址,而 SSDT 各个函数的原始地址,自然是存储在内核文件里的.于是,有了以下思路: 1.获得内核里 KiService ...
- nodejs-安装/helloworld/npm
安装---------------------------------------------------------------- http://nodejs.cn/download/ 完成之后确定 ...
- 删除自定义服务 寒江孤钓<<windows 内核安全编程>> 学习笔记
书中第一章 成功启动first服务之后, 发现书中并没有介绍删除服务的方式, SRVINSTW工具中的移除服务功能,也无法找到我们要删除的服务, 于是,搜素了下,发现解决方法如下: 在cmd中输入 & ...
- GUI简单实战——贪吃蛇
将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目 项目功能 用键盘上下左右实现贪吃蛇的自动移动 贪吃蛇吃到食物后,长度加一,分数加一 贪吃蛇吃到自己的身体,则游戏结束 按空格键实现游戏的暂 ...