欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

ES入门学习笔记

时间:2023-07-21
介绍:

ES是一个分布式文档的非关系型数据库(文档类似于关系型数据库中的单条记录),文档的每个字段默认会被索引,每个字段的数据均可被搜索,能够横向扩展至数以百计的服务器存储以及处理PB级的数据。ES基于Restful Api接口,可通过Restful Api与ES进行交互。

使用案例:

es可作为博客系统的数据库,文章等内容储存到es中,可根据文章内容进行快速检索当关系型数据库中数据量特别大查询慢时,可将大量数据导入es中,查询走es部署大规模的日志框架、logstash采集日志,es存储、搜索和分析海量的事件,kibana可视化查看结果;ELK技术,elasticsearch+logstash+kibana

es官方指南

快速启动项目

在Windows环境下,下载es与Kibana,Kibana是一个开源的分析与可视化平台,可通过kibana的Dev Tool与es的数据进行CURD,kibana版本和es版本同步更新,所以两者最好使用一致的版本,下载地址:es下载,kibana下载

下载后解压各自的压缩包,在cmd中运行各自压缩包下bin目录下的.bat文件即可;es默认端口号9200,kibana默认端口号5601,访问localhost:5601进入kibana

概念

索引 index:一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。

类型:类似传统关系数据库中的表,在es旧版本当中一个索引库中可包含多个类型,在es的索引中,不同的映射类型中存在相同的属性名,他们底层都是使用同一个Lucene属性,由于在同一个索引库不同类型中字段比较少或没有,会影响es的查询效率,所以后续在 es6.0.0 版本中一个文档只能包含一个类型,而在 7.0.0 中,类型则将被弃用,到了 8.0.0 中则将完全删除。7.x中的类型默认为_doc

文档:相当于关系型数据库的单条记录

字段:相当于关系型数据库中的 columns 列

倒排索引:

关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。在es中,一个文档中的每一个属性默认被创建了倒排索引。一个没有倒排索引的属性是不能被搜索到的。 es查询为什么快?

倒排索引操作步骤:

先将文档中包含的关键字全部提取出来然后再将关键字与文档的对应关系保存起来最后对关键字本身做索引排序。

这样在用户检索关键字时, 可以先查找关键字索引,在通过关键字与文档的对应关系查找到所在的文档。

如下面的三个文档:

idagesexname118female北大220male河北大学青年318male爱国青年

包含指定关键字的文档:

序号关键字包含文档1北大1,22河北23大学24青年2,35爱国36181,372028male2,39female1

根据关键字查询,可直接检索出结果文档

RestApi methodurl描述PUTlocalhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)POSTlocalhost:9200/索引名称/类型名称创建文档(随机文档id)POSTlocalhost:9200/索引名称/类型名称/文档id/_update修改文档DELETElocalhost:9200/索引名称/类型名称/文档id删除文档GETlocalhost:9200/索引名称/类型名称/文档id查询文档通过文档idPOSTlocalhost:9200/索引名称/类型名称/_search查询所有数据字段主要数据类型 字符串类型: text, keyword数字类型:long, integer, short, byte, double, float, half_float, scaled_float日期:date日期 纳秒:date_nanos布尔型:booleanBinary:binaryRange: integer_range, float_range, long_range, double_range, date_range 分片

分片分为主分片与复制分片

分片类似与mysql中的分库分表,es在创建索引库时可设置创建几个主分片与复制分片,默认情况下,一个索引被分配 5 个主分片,一个主分片有一个复制分片,每个文档存储在独立的主分片中,插入一个文档时,会根据文档的_id(唯一id)决定该文档存储在哪个主分片中;

复制分片只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的分片取回文档。主分片或者复制分片都可以处理读请求——搜索或文档检索,所以数据的冗余越多,能处理的搜索吞吐量就越大。

es深入分片

举例

更全面的用kibana查询es数据教程

聚合查询

// 创建一个商品索引库,不指定类型,类型默认PUT goods{ // mappings 就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。"mappings": {"properties": {"goodsId": {"type": "integer"}, // 设置goodsName类型为text用于全文检索,同时类型又为keyword用于关键词搜索 // keyword类型的字段默认会排序,取数据时会直接根据顺序输出,查询效率高"goodsName": {"type": "text","fields": {"keyword": {"type": "keyword", // 索引最大的字段值长度,超出部分不会被索引且存储"ignore_above": 256}}},"createTime": {"type": "date"}}}}// 插入一条商品数据,不指定idPOST goods/_doc{ "goodsId":1, "goodsName":"商品1", "createTime":"1643178793939"}

// 查询所有数据GET goods/_search// 结果:{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, // 共两条数据 "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "goods", "_type" : "_doc", "_id" : "vhqYlX4BFS2tMwa2XXMK", "_score" : 1.0, "_source" : { "goodsId" : 1, "goodsName" : "商品1", "createTime" : "1643178793939" } }, { "_index" : "goods", "_type" : "_doc", "_id" : "wRqYlX4BFS2tMwa2dXO9", "_score" : 1.0, "_source" : { "goodsId" : 2, "goodsName" : "商品2", "createTime" : "1643178793939" } } ] }}

// 根据goodsId条件查询GET goods/_search{ "query": { "match": { "goodsId": 1 } }}// 结果:{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "goods", "_type" : "_doc", "_id" : "vhqYlX4BFS2tMwa2XXMK", "_score" : 1.0, "_source" : { "goodsId" : 1, "goodsName" : "商品1", "createTime" : "1643178793939" } } ] }}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。