0
点赞
收藏
分享

微信扫一扫

Elasticsearch史上最全学习分享


ElasticSearch:智能搜索,​​分布式​​的搜索引擎

是ELK的一个组成,是一个产品,而且是非常完善的产品,ELK代表的是:E就是ElasticSearch,L就是Logstach,K就是kibana

E:EalsticSearch 搜索和分析的功能

L:Logstach 搜集数据的功能,类似于flume(使用方法几乎跟flume一模一样),是日志收集系统

K:Kibana 数据可视化(分析),可以用图表的方式来去展示,文不如表,表不如图,是数据可视化平台

Elasticsearch史上最全学习分享_搜索

全文检索

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义处理也很容易。中文等东方文字则需要切分字词,以达到按词索引的目的,关于这方面的问题,是当前全文检索技术尤其是中文全文检索技术中的难点,在此不做详述。

倒排索引

以前是根据ID查内容,倒排索引之后是根据内容查ID,然后再拿着ID去查询出来真正需要的东西。

Elasticsearch史上最全学习分享_学习_02

ES的由来

因为Lucene有两个难以解决的问题:

1)数据越大,存不下来,那我就需要多台服务器存数据,那么我的Lucene不支持分布式的,那就需要安装多个Lucene然后通过代码来合并搜索结果。这样很不好

2)数据要考虑安全性,一台服务器挂了,那么上面的数据不就消失了。

ES就是分布式的集群,每一个节点其实就是Lucene,当用户搜索的时候,会随机挑一台,然后这台机器自己知道数据在哪,不用我们管这些底层

ES的优点

1.分布式的功能

2、数据高可用,集群高可用

3.API更简单

4.API更高级。

5.支持的语言很多

6.支持PB级别的数据

7.完成搜索的功能和分析功能

ES的核心概念

index 索引(索引库)

我们为什么使用ES?因为想把数据存进去,然后再查询出来。

我们在使用Mysql或者Oracle的时候,为了区分数据,我们会建立不同的数据库,库下面还有表的。

其实ES功能就像一个关系型数据库,在这个数据库我们可以往里面添加数据,查询数据。

ES中的索引非传统索引的含义,ES中的索引是存放数据的地方,是ES中的一个概念词汇

index类似于Mysql里面的一个数据

type类型

类型是用来定义数据结构的。在每一个index下面,可以有一个或者多个type,好比数据库里面的一张表。相当于表结构的描述,描述每个字段的类型。

document文档

文档就是最终的数据,可以认为一个文档就是一条记录。是ES里面最小的数据单元,就好比表里面的一条数据

Field 字段

好比关系型数据库中列的概念,一个document有一个或者多个field组成。

shard分片

一台服务器,无法存储大量的数据,ES把一个index里面的数据,分为多个shard,分布式的存储在各个服务器上面。

kafka:为什么支持分布式的功能,因为里面是有topic,支持分区的概念。所以topic A可以存在不同的节点上面。就可以支持海量数据和高并发,提升性能和吞吐量

从 7.x 版本开始,不设置 index 的 shard 数,缺省主分片由 5 改为了 1 个。

replica副本

一个分布式的集群,难免会有一台或者多台服务器宕机,如果我们没有副本这个概念。就会造成我们的shard发生故障,无法提供正常服务。

我们为了保证数据的安全,我们引入了replica的概念,跟hdfs里面的概念是一个意思。可以保证我们数据的安全。

在ES集群中,我们一模一样的数据有多份,能正常提供查询和插入的分片我们叫做 primary shard,其余的我们就管他们叫做 replica shard(备份的分片)

当我们去查询数据的时候,我们数据是有备份的,它会同时发出命令让我们有数据的机器去查询结果,最后谁的查询结果快,我们就要谁的数据(这个不需要我们去控制,它内部就自己控制了)

总结

在默认情况下,我们创建一个库的时候,默认会帮我们创建5个主分片(primary shrad)和5个副分片(replica shard),所以说正常情况下是有10个分片的。

同一个节点上面,副本和主分片是一定不会在一台机器上面的,就是拥有相同数据的分片,是不会在同一个节点上面的。

所以当你有一个节点的时候,这个分片是不会把副本存在这仅有的一个节点上的,当你新加入了一台节点,ES会自动的给你在新机器上创建一个之前分片的副本。

ES的相关命令

GET _cat/health 查看集群的健康状况

PUT 类似于SQL中的增

DELETE 类似于SQL中的删

POST 类似于SQL中的改

GET 类似于SQL中的查

index的操作:

PUT /[index] 增加一个[index]名称的index库

DELETE /[index] 删除一个[index]名称的index库

GET _cat/indices  GET _all 查询ES中所有的index

ES的CURD操作示例

·插入一条数据

Elasticsearch史上最全学习分享_elasticsearch_03

注意:我们插入数据的时候,如果我们的语句中指明了index和type,如果ES里面不存在,默认帮我们自动创建

·查询数据

Elasticsearch史上最全学习分享_学习_04

语法: GET /index/type/id

·修改数据

使用POST来修改数据,其实使用PUT也可以实现修改数据,原理和hbase比较像。

Elasticsearch史上最全学习分享_搜索_05

 

Elasticsearch史上最全学习分享_学习_06

PUT如果仅对一个字段进行修改,会丢失其他的字段数据,PUT进行的是全局的修改!

POST是局部更新数据,别的数据不动

·删除数据

Elasticsearch史上最全学习分享_学习_07

·查看所有数据

Elasticsearch史上最全学习分享_数据_08

Elasticsearch史上最全学习分享_全文检索_09

took:耗费了318毫秒

shards:分片的情况

total:分片数量

hits:获取到的数据的情况

total:包含与搜索条件匹配的文档总数信息的对象

value:表示总命中计数的值

确切来说默认情况下,hits.total.value是不确切的命中计数,在这种情况下,当hits.total.relation的值是eq时,hits.total.value的值是准确计数。当hits.total.relation的值是gte时,hits.total.value的值是不准确的。

max_score:1 所有数据里面打分最高的分数

_index:"test_index" index名称

_type:"test_type" type的名称

_id:"2" id号

_score:1 分数,这个分数越大越靠前出来

DSL语言

ES最主要是用来做搜索和分析的。所以DSL还是对于ES很重要的

下面示例的代码都是RESTful风格

query  DSL:domain Specialed Lanaguage 在特定领域的语言

案例

·进行全表扫描使用DSL语言,查询所有的物料

Elasticsearch史上最全学习分享_学习_10

使用match_all 可以查询到所有文档,是没有查询条件下的默认语句。

·查询所有客户里面包含客户1的物料信息,并通过数量升序排序

 

Elasticsearch史上最全学习分享_学习_11

match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。

Elasticsearch史上最全学习分享_搜索_12

·分页查询

Elasticsearch史上最全学习分享_数据_13

 

·进行全表扫描,但返回指定字段的数据

Elasticsearch史上最全学习分享_全文检索_14

 

·查询所有客户里面包含客户1的物料信息,并且数量大于4

如果需要多个查询条件拼接在一起就需要使用bool

bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:

must: 多个查询条件的完全匹配,相当于 and。

    must_not: 多个查询条件的相反匹配,相当于 not。

    should: 至少有一个查询条件匹配, 相当于 or。

    这些参数可以分别继承一个过滤条件或者一个过滤条件的数组

Elasticsearch史上最全学习分享_搜索_15

·展示一个全文检索的效果

Elasticsearch史上最全学习分享_学习_16

 

首先查询条件也会进行分词

UL

/

ROHS

并集

·不要把条件分词,要精确匹配

举报

相关推荐

0 条评论