ElasticSearch

230 阅读8分钟

www.cnblogs.com/heqiyoujing…

1、lucene的底层是倒排索引

2、全文索引说什么

3、lucene

es的分布式基本原理是什么?

es的写数据和读数据的实现原理

答: 写过程:客户端访问协调节点,为master节点,每次写数据,都需要先进入协调节点,再根据hash计算后,路由到对应的primary节点,写入以后,primary节点会将数据同步到replica shard,如果primary和relica节点都已经写入,协调节点会将执行响应返回给客户端

内存buffer、translog文件、os cache 、segment file的关系 过程:

每次写数据,数据都会分别存到内存buffer和translog文件中,

buffer数据每隔1s执行一次fresh操作,将数据刷到os cache中,

translog每30分钟或者到达一定的量就执行commit操作(flush操作)。1、写commit point;2、将os cache数据强刷到磁盘 3、清空translog日志, 同时translog每5秒持久化一次

os cache数据到一定量也会持久化到磁盘 生成新的 segment file

merge:在segment file达到一定程度的时候,会执行merge,将segment file文件合并成大文件,将标记为。del的数据不合并,从而生成大文件segment file

数据写入到segment file 就会建立倒排索引

es的数据丢失问题:

es是准实时的,数据写入1s后,可能会丢失数据,因为有5秒的数据是在buffer,translog buffer,os cache,segmentfile os cache中,没有在磁盘里,机器宕机后,会数据丢失(也就是translog每5秒持久化一次的期间)

可以通过设置,每次写入buffer,都会将translog持久化到磁盘,但是es服务性能会降低

删除数据

是软删除,对数据标记,查询时查询不到

merge:在segment file达到一定程度的时候,会执行merge,将segment file文件合并成大文件,将标记为。del的数据不合并,从而生成大文件segment file

查询操作:

根据查询的条件:

被hash到对应的 分片,对分片使用负载均衡算法,找到对应的replica shrard或者primary shard,对查询的结果返回给协调节点,协调节点将数据返回给客户端

搜索操作:

协调节点会请求各个分片找出对应的document,返回给协调节点,筛查匹配,返回客户端

知道数据被refresh 到 os cache中,客户端就可以搜索到该数据

es数据量大的时候,es如何提高查询的性能

filesystem cache 操作系统的缓存,如果es的segment file远大于filesystem cache,es的性能会大大减低,只有保证大部分查询的数据都在 filesystem cache (操作系统内存),才能保证es的高性能

下面是保持高性能的措施:

架构: 为了保持高性能es的数据最好90%都可以存放在filesystem cache 中,索引es可以存放关键的查询字段,具体的明细可以存放在mysql获取hbase中,维持高性能。如果大量数据需要存在es,则增加集群的机器数,从而提高内存值

同样可以运用在redis中

数据预热:将热点数据先存到 filessytem cache

冷热分离 ,冷数据和热数据分到不同的机器,filesystem cache 实现了人数据的高性能读取

数据模型优化 es不要使用关联查询,如果需要关联,在插入数据的时候,就将关联的数据一并插入

es的生产部署架构,索引的量,分片数

但是如果你确实没干过,也别虚,我给你说一个基本的版本,你到时候就简单说一下就好了

(1)es生产集群我们部署了5台机器,每台机器是6核64G的,集群总内存是320G

(2)我们es集群的日增量数据大概是2000万条,每天日增量数据大概是500MB,每月增量数据大概是6亿,15G。目前系统已经运行了几个月,现在es集群里数据总量大概是100G左右。

(3)目前线上有5个索引(这个结合你们自己业务来,看看自己有哪些数据可以放es的),每个索引的数据量大概是20G,所以这个数据量之内,我们每个索引分配的是8个shard,比默认的5个shard多了3个shard。

1、数据会分布到不同的服务进程,每个服务进程都会分配一个primary sharp和replicashard

2、服务会有一个master,如果哪个服务宕机,会选举其他的服务作为master,如果是replica shard会改成primarily shard,宕机的shard启动后,变为relicate shard

kibana:ES的可视化界面

IK分词器:中文的分词能力较强

solor和ES的区别:

solor多变动的数据,查询效率低 集群的实现,需要依赖zookeeper

es是分布式的,可以自己完成集群,在变动数据的条件下,查询效率没有减低,支持大数据和云计算

es的镜像 daocloud.io/library/elasticsearch:6.5.4

Elasticsearch的结构:

ES服务分为:分词器(维护索引)和存放数据服务

ES的结构说明: 1、ES的服务中可以创建多个索引

2、每个索引分为5片存储,这样可以提高查询的效率

3、每个分片都会至少存放一份备份分片

4、备份分片默认不会帮助检索数据,当ES的检索压力增加时,备份分片会帮助检索数据。

5、备份的分片必须放在不同的服务器中

索引的结构说明: 在ES服务中会创建多个index索引,每个索引下可以创建多个type,每个type下可以创建多个document类似于sql中的表,document下的field类似与sql的字段

索引下有多个type(在7版本以后,取消了type)

restful风格的ES操作语法,主要是在kibana中使用

get请求(查询操作)

语法结构:

ES服务的地址ip:port/索引

ES服务的地址ip:port/索引/doc_id

例子:

post请求(可以实现查询和修改操作),查询的条件存放在请求体

put请求(创建索引)

delete请求

创建索引:设置分片数和备份数

查看索引信息:

删除索引:

ES的field指定类型

查询出的索引信息说明:

创建索引例子说明1:

创建索引例子说明2:

文档的操作

插入数据:

自动生成id插入数据(不推荐)

说明:book为type,novel为document

手动指定id:

修改: 覆盖式修改:

非覆盖式修改,在请求的后面增加_update,请求体中增加具体修改哪些内容

删除文档

语法:delete /index/type/id

java连接ES

创建索引结构

删除索引

插入数据流程:

插入数据:

修改文档

删除文档

批量删除和添加

ES查询:

term和terms:

resful风格查询 term完全匹配,不会对查询的条件进行分词

语法说明:from size 是分页的设置

java方法使用term查询

说明:

searchrequest(index) 创建request对象

searchsourcebuilder() 设置查询的条件

terms查询,类似于in条件查询

restful风格的查询:

JAVA代码实现

request对象和查询条件的创建和term的实现相同:

matchall查询(查询所有的数据)

match查询的特点:

1、查询的是日期或者数值,会将传入的字符串类型转为相关的格式

2、如果查询的内容是不能被分词的内容(keyword),match查询不会对你的指定查询关键字进行分词

3、如果查询的内容时可以被分词的内容(text),match会将你指定的查询内容根据一定的方式分词,去分词库中匹配指定的内容

4、match的查询,实际底层的实现时term

match查询(根据提高的查询条件查询)

布尔match查询(SQL 的in条件)

mutimatch

id,ids查询(不需要创建查询条件对象searchsourcebuilder)

前缀查询(按前面的查询条件匹配)

fuzzy查询(模糊查询,对查询的条件进行分词,分别进行查询合并)

wildcard查询 类似于like 通过 通配符或者占位符查询实现

  • 同配 ?占位 通配符的条件,只要前面的符合要求即可,占位符,要求后面的数据位置刚好和?的数量匹配

range范围查询 (数值的范围查询)

regex查询 (正则表达式查询)

深分页scoll

java实现

释放内存空间

delete-by-query(根据查询的条件删除文档)

java实现

bool查询

查询条件

java查询

restful boot查询

java实现

filter查询(不排序,不算分,有缓存,所有效率比query高)

java实现

聚合查询:

去重计数

range查询

时间范围统计:

ip统计

java实现

统计聚合查询extend

地图经纬度查询

经纬度的索引创建

添加数据

restful实现:

根据距查询

根据巨星查询

多边形查询的java实现