Elastic基本概念
目录
- 概述
- 官网
- 小故事
- Elasticsearch的数据结构
- 基本概念
- 1. DSL:相当于数据库的SQL语句
- 2. 文档Document(相当于数据库的一行记录):
- 3. ~~类型Type~~ (7.x 版移除 Type)
- 4. 索引Index(相当于数据库)
- 5. Node 与 Cluster
- 中文分词设置
- 数据操作(增删改查)
- 基本Rest命令说明:
- 字段数据类型
- 通过get _cat/ 可以获取ElasticSearch的当前的很多信息
- 1. 增
- 创建一个索引
- 指定字段的类型
- 2. 删
- 3. 改
- 旧方案,使用put进行修改(会覆盖原来的值,相当于删除旧数据,插入新数据):
- 新方案,使用post的update(需要注意doc字段,不会丢失字段):
- 4. 查
- 获取建立的规则
- 获取默认信息
- 花样查询
- 简单条件的查询:
- 匹配查询:
- 多条件查询
概述
Elasticsearch的强大之处就是可以模糊查询。SQL也可以模糊查询,但是SQL的数据量一旦特别大,耗时就会非常长。Elasticsearch可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。
Elastic 的底层是开源库 Lucene。Lucene只是一个库。 想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,糟糕的是, Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的,你没法直接用 Lucene,必须自己写代码去调用它的接口。ElasticSearch是基于Lucene 做了一下封装和增强,提供了 REST API 的操作接口,开箱即用。es通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
官网
https://www.elastic.co/cn/downloads/elasticsearch
小故事
多年前,一个叫做Shay Banon的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的Lucene。
直接基于Lucene工作会比较困难,所以Shay开始抽象Lucene代码以便lava程序员可以在应用中添加搜索功能。他发布了他的第一个开源项目,叫做“Compass”。
后来Shay找到一份工作,这份工作处在高性能和内存数据网格的分布式环境中,因此高性能的、实时的、分布式的搜索引擎也是理所当然需要的。然后他决定重写Compass库使其成为一个独立的服务叫做Elasticsearch。
第一个公开版本出现在2010年2月,在那之后Elasticsearch已经成为Github上最受欢迎的项目之一,代码贡献者超过300人。一家主营Elasticsearch的公司就此成立,他们一边提供商业支持一边开发新功能,不过Elasticsearch将永远开源且对所有人可用。
Shay的妻子依旧等待着她的食谱搜索……
Elasticsearch的数据结构
- 正向索引:如同目录
- 倒排索引:也可以称作反向索引或者Lucene索引底层,(正向索引如同目录)一般是根据某个不完整的词再查找对应记录,叫做倒排索引。简单说就是按
文章关键字,对应的文档(0个或多个)
形式建立索引,根据关键字就可直接查询对应的文档(含关键字的),无需查询每一个文档,如下图
Elastic 默认端口:9200端口
基本概念
可以把es看做一个DB,概念之间有互通,可以近似理解
elasticsearch(集群)中可以包含多个索引(数据库) ,每个索引中可以包含多个类型(表) ,每个类型下又包含多个文档(行) ,每个文档中又包含多个字段(列)。
1. DSL:相当于数据库的SQL语句
2. 文档Document(相当于数据库的一行记录):
索引和搜索数据的最小单位是文档。
Index 里面单条的记录称为 Document(文档),许多条 Document 构成了一个 Index。
Document 使用 JSON 格式表示,下面是一个例子。
{"user": "张三","title": "工程师","desc": "数据库管理"
}
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
3. 类型Type (7.x 版移除 Type)
Document 可以分组,比如weather
这个 Index 里面,可以按城市
分组(北京和上海)
,也可以按气候
分组(晴天和雨天)
。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
不同的 Type 应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products和logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。
4. 索引Index(相当于数据库)
index就是一个非常大的文档集合
Elastic 会索引所有字段,经过处理后写入一个反向索引,也可以称为倒排索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
Elasticsearch最外层的是Index(相当于数据库 表的概念);一个Index的数据我们可以分发到不同的Node上进行存储,这个操作就叫做分片,默认分片为5
。分片的原因:如果一个Index的数据量太大,只有一个分片,那只会在一个节点上存储,随着数据量的增长,一个节点未必能把一个Index存储下来。
一个集群至少有一个节点,而一个节点就是一个elasricsearch进程,节点可以有多个索引默认的,如果你创建索引,那么索引将会有个5个分片(primary shard ,又称主分片)构成的,每一个主分片会有一个副本(replica shard,又称复制分片)
多个分片,在写入或查询的时候就可以并行操作(从各个节点中读写数据,提高吞吐量),分片会有主分片和副本分片之分(为了实现高可用)数据写入的时候是写到主分片,副本分片会复制主分片的数据,读取的时候主分片和副本分片都可以读。Index需要分为多少个分片和副本分片都是可以通过配置设置的
下面的命令可以查看当前节点的所有 Index。
GET _search
{"query":{"match_all":{}}
}
5. Node 与 Cluster
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
Master Node
它主要负责维护索引元数据、负责切换主分片和副本分片身份等工作(可以理解成hdfs的activeNode),如果主节点挂了,会选举出一个新的主节点。
中文分词设置
首先,安装中文分词插件。如果要使用中文,建议使用IK分词器,也可以考虑其他插件(比如 smartcn)。IK分词器提供了两个分词算法:ik_smart(最少切分)
和ik_max_word(最细粒度划分:穷尽词库所有可能)
。
分词:把一段中文或者其他文字划分为一个个的关键字,搜索时会把自己的信息进行分词。
官网:https://github.com/medcl/elasticsearch-analysis-ik/releases
$ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip
上面代码安装的是5.5.1版的插件,与 Elastic 5.5.1 配合使用。
接着,放入Elastic的plugins目录中,重新启动 Elastic,就会自动加载这个新安装的插件。
数据操作(增删改查)
基本Rest命令说明:
method | url地址 | 描述 |
---|---|---|
PUT(创建,修改) | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST(创建) | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST(修改) | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE(删除) | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET(查询) | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档ID |
POST(查询) | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
字段数据类型
- 字符串类型
- text、keyword
- text:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储;
- keyword:不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
- text、keyword
- 数值型
long、Integer、short、byte、double、float、half float、scaled float - 日期类型
date - 布尔类型
boolean - 二进制类型
binary
通过get _cat/ 可以获取ElasticSearch的当前的很多信息
通过 GET 请求发送 cat 命名可以列出所有可用的 API:
=^.^=(顶上有一只猫)
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
1. 增
创建一个索引
PUT /test1/type1/1
{"name" : "hzy","age" : 25
}
指定字段的类型
PUT /test2
{"mappings": {"properties": {"name": {"type": "text"},"age":{"type": "long"},"birthday":{"type": "date"}}}
}
2. 删
GET /test1
DELETE /test1
3. 改
有两种方案
旧方案,使用put进行修改(会覆盖原来的值,相当于删除旧数据,插入新数据):
PUT /test3/_doc/1
{"name" : "es真的很有意思","age" : 25,"birth" : "1996-02-15"
}GET /test3/_doc/1//如果漏掉某个字段没有写,原先的其他字段值会消失
PUT /test3/_doc/1
{"name" : "es真没意思,再也不学了"
}GET /test3/_doc/1
新方案,使用post的update(需要注意doc字段,不会丢失字段):
POST /test3/_doc/1/_update
{"doc":{"name" : "es的新修改方式"}
}GET /test3/_doc/1
如果执行后可以看到,记录的 Id 没变,但是版本(version)从1变成2,操作类型(result)从created变成updated,created字段变成false,因为这次不是新建记录。
4. 查
获取建立的规则
GET test2
获取默认信息
PUT /test3/_doc/1
{"name": "hzy","age": 25,"birth": "1996-02-15"
}GET test3
花样查询
简单条件的查询:
GET /test3/_doc/_search?q=name:hzy
匹配查询:
- match:匹配(会使用分词器解析(先分析文档,然后进行查询))
- _source:过滤字段
- sort:排序
- form、size 分页
GET /blog/user/_search{"query":{//匹配"match":{"name":"hzy"}},//过滤字段"_source": ["name","desc"],"sort": [{//按照年龄升序排列"age": {"order": "asc"}}],//从索引0开始,也就是从第一个开始"from": 0,//限制展示数量"size": 1}
多条件查询
- must 相当于 and
- should 相当于 or
- must_not 相当于 not (… and …)
- filter 过滤
GET /blog/user/_search
{"query":{"bool": {"must": [{"match":{"age":3}},{"match": {"name": "hzy"}}],"filter": {"range": {"age": {"gte": 1,"lte": 3}}}}}
}
待续
Elastic基本概念相关推荐
- Elastic核心概念
什么是es 什么是ES? ES是Elasticsearch的简称,Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引 ...
- Elastic Search 介绍和基本概念
Elastic Search 特点 Elastic Search 可能是是当下最火的搜索引擎中间件了.为什么这么火呢?主要是因为他有几大绝艺: 快速.无论什么时候,你需要向 ES 查询你的数据,都能够 ...
- 2021年大数据ELK(五):Elasticsearch中的核心概念
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Elasticsearch中的核心概念 一.索引 index 二 ...
- 2021年大数据ELK(一):集中式日志协议栈Elastic Stack简介
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.简介 二.ELK 协议栈介绍及体系结构 三.集中式日志协议栈 ...
- 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍
简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...
- ElasticSearch 2 (7) - 基本概念
ElasticSearch 2 (7) - 基本概念 摘要 ElasticSearch的一些基本核心概念,理解这些概念有助于ElasticSearch的学习 准实时NRT(Near Realtime) ...
- Elastic 的成功上市:偶然和必然
国庆长假已经结束,该收收心了 , 开工干活! 假期期间有个公司上市了,首日大涨,市值接近50亿美元,又掀起了一波造富运动,这个公司就是Elastic. 作为后端的程序员,如果没有听说过Elastic及 ...
- Elastic Stack简介和Elasticsearch基本介绍
1. Elastic Stack简介 1.1简介 ELK是一个免费开源的日志分析架构技术栈总称,官网https://www.elastic.co/cn.包含三大基础组件,分别是Elasticsearc ...
- ElasticSearch探索之路(一)初识ElasticSearch:特点、应用场景、架构设计、基本概念
文章目录 什么是ElasticSearch? Lucene ELK Elasticsearch的特点 应用场景 架构设计 基本概念 文档 类型 索引 什么是ElasticSearch? Elastic ...
- 腾讯技术课|基于Elastic Stack 搭建日志分析平台
为了让读者们可以更好的理解「如何基于Elastic Stack 搭建日志分析平台」,腾讯技术工程公众号特别邀请腾讯基础架构部的陈曦工程师通过语音录播分享的方式在「腾讯技术课」小程序里同步录制了语音+P ...
最新文章
- MySql 基于C_API的数据库封装
- 基于HTML5 Canvas 实现弹出框
- Ubuntu 使用phpmyadmin,报错#1146 - Table ‘phpmyadmin.pma_table_uiprefs' doesn't exist
- python面试-2018年最常见的Python面试题答案(上篇)
- hdu 2112 HDU Today 最短路(Dijkstra算法)
- iOS开发UI篇 程序启动原理和UIApplication
- 关于sql中的with(nolock)
- fastjson对json字符串JSONObject和JSONArray互相转换操作示例
- anaconda写python代码视频_如何安装Python运行环境Anaconda?(视频教程)
- 南下事业篇——深圳 深圳(回顾)
- 你应该知道的 HBase 基础,都在这儿了
- CANN5.0黑科技解密 | 别眨眼,缩小隧道,让你的AI模型“身轻如燕”
- curry化 js_前端发动机从 bind 聊到 curry (柯里化)
- Make things beautiful again !
- Facebook股价周四大涨15.5% 市值超亚马逊
- android桌面快捷网页,Android向桌面添加快捷方式,使其指向特定的网页
- 计算机中的振动原理,机械振动
- Smplayer播放wmv视频文件
- shiro原理_Shiro-实战(二)-身份认证
- php msvcr100.dll丢失,WAMP启动报错MSVCR100.dll丢失