• 内容概述

  • 什么是Elasticsearch,为什么要使用它?

  • 基础概念简介

    • 节点(node)

    • 索引(index)

    • 类型映射(mapping)

    • 文档(doc)

  • 本地环境搭建,创建第一个index

  • 常用RESTful Api示例

    • 新增文档

    • 查询文档-不分词类型

    • 查询文档-分词类型

内容概述

本文内容主要集中在应用层,通过下面几个部分介绍当前最流行的搜索工具: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安装Elasticsearchkibana镜像,kibana是es官方配套的可视化分析工具,使用它的页面dev tools可以很方便的通过api操作es。

因为要同时部署两个docker镜像,这里推荐使用docker-composer,桌面版安装完成后就带有该命令,需要的配置如下:

services:kibana:image: kibana:7.2.0container_name: kibana-simpleenvironment:- TIMELION_ENABLED=trueports:- "5601:5601"networks:- mynetworkelasticsearch:image: elasticsearch:7.2.0container_name: es-simpleenvironment:- 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: -1hard: -1volumes:- esdata1:/usr/local/elasticsearch/simpledataports:- 9200:9200networks:- mynetworkvolumes:esdata1:driver: localnetworks:mynetwork:driver: bridge

创建一个名称为docker-compose.yaml文件,复制下面的配置到文件中,然后再文件所在目录执行docker-compose up,之后会启动两个docker实例,分别是elasticsearchkibana

在本地浏览器中,访问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,这些例子都是直接在kibanadev 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会被分词为callaaaservice,所有包含这三个词的文档都会被搜索出来,例如下面:

//普通搜索,两个文档都会返回
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"}}
}

那如果条件是包含callaaaservice,但是不一定是连着的,该如何搜索呢?可以使用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。

以上内容属个人学习总结,如有不当之处,欢迎在评论中指正

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

这篇实战攻略,带你轻松入门Elastic search相关推荐

  1. 数学菜鸟的AI学习攻略 | 数学符号轻松入门

    你是否跟我一样,自幼恨透数学. 现在,我终于发现了我对数学绝缘的最主要原因:我的老师从来不去回答最重要的问题:我为什么要学数学?学数学有什么用? 他们只是在黑板上写下一大堆方程,并让我记下来. 现在, ...

  2. 数学菜鸟的AI学习攻略——数学符号轻松入门

    [ 导读 ] 自学AI的过程中,我们非常需要理解这些数学符号.它可以让你用一种非常简洁的方式来表达一个复杂的想法. 你是否跟我一样,自幼恨透数学. 现在,我终于发现了我对数学绝缘的最主要原因:我的老师 ...

  3. Transformer入门篇-深度万字长文带你轻松入门深度学习框架

    前言 transformer结构是google在17年的Attention Is All You Need论文中提出,在NLP的多个任务上取得了非常好的效果,可以说目前NLP发展都离不开transfo ...

  4. 直播预告 | 企业如何轻松完成数据治理?火山引擎 DataLeap 给你一份实战攻略!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 企业数字化转型正席卷全球,这不仅是趋势所在,也是企业发展必然面对的考题,也是企业最关心.最难决策的难题,数字化不仅 ...

  5. Python 网络爬虫实战:爬取《去哪儿》网数千篇旅游攻略数据,再也不愁旅游去哪儿玩了

    好久不见! 今天我们来爬取 去哪儿网站 的 旅游攻略 数据. 0x00  找一个合理的作案动机 作为一名立志成为技术宅的普通肥宅,每次一到周末就会面临一个人生难题:这周末怎么过? 本来是没有这些问题的 ...

  6. Centos7 安装ELK/EFK 7.x 集群搭建实战攻略

    Centos7 安装ELK/EFK 7.x 集群搭建实战攻略 1.1 写在前面的话 1.2 开始之前 1.3 安装ELK/EFK 1.3.1 海量数据存储和检索-->E-->安装Elast ...

  7. VMware HA实战攻略之四VMware HA安装及配置

    [IT168 专稿]在前面三篇文章中(点击1.2.3),不但讲述了如何准备适合虚拟化的硬件.软件,以及如何使用现有的硬件.软件搭建一套实验环境,还讲述了通过VC Server如何添加主机和ISCSI存 ...

  8. VMware HA实战攻略之五VMwareHA测试验收

    [IT168 专稿]在上一篇"VMware HA实战攻略之四VMwareHA安装及配置"中(点击),讲述了VMwareHA的概念及创建过程,还讲述了创建过程中要注意的一些事项. 在 ...

  9. Mware HA实战攻略之五VMwareHA测试验收

    [IT168 专稿]在上一篇"VMware HA实战攻略之四VMwareHA安装及配置"中(点击),讲述了VMwareHA的概念及创建过程,还讲述了创建过程中要注意的一些事项. 在 ...

最新文章

  1. 腾讯面试官:如何停止一个正在运行的线程?我蒙了。。。
  2. tensorflow入门基础
  3. linq to sql简单使用
  4. 最长子段和 11061008 谢子鸣
  5. Codeforces Round #506 (Div. 3) - D. Concatenated Multiples(思维)
  6. Token 认证的来龙去脉
  7. TLS/SSL 工作原理及握手过程详解
  8. mysql显错注入,SQL注入:显错注入
  9. HTML基础知识(未完待续)
  10. 输入一个数3256,将他从小到大输出,就是2356
  11. 一文理解JDK静态代理、JDK动态代理、Cglib动态代理
  12. 【jQuery笔记Part2】04-jQuery淡入淡出动画右下角广告案例
  13. Linux 命令(13)—— cut 命令
  14. UVA10191 Longest Nap【排序】
  15. springMVC web项目 对访问数据库的用户名密码进行加密解密
  16. 使用apidoc 生成Restful web Api文档——新手问题与解决方法
  17. C语言文件IO实现图书馆管理系统,登录、注册、借书、还书和新增书籍
  18. matlab 数字显示完整,如何在matlab中同时显示字符串和数字?
  19. 计算机网络常用五种编码方式,五种常见的基带数字编码方式
  20. 鸿鹄818芯片:小米电视千万销量面前的“水滴”

热门文章

  1. 如何使用 Ansible 和 anacron 实现自动化
  2. python中关于sqlite3数据库删除数据的使用
  3. 数据结构[栈与队列]的基本操作
  4. c语言printf 空格,在打印输出前面添加空格,如在C中[printf(%2i)]
  5. php双向链表,双向链表的GO语言实现
  6. ACM小白入门之必须要了解的东西
  7. 射极跟随器实验报告数据处理_射极跟随器实验报告模式
  8. 服务器 上传文件 杀毒,一种实现文件上传网站后自动进行杀毒的方法及系统
  9. python将图像转换为8位单通道_Python OpenCV读取16位单通道图像并转换为8位灰度图显示...
  10. 【k8s最容易理解的科普】到底是什么 用处是什么