Java面试题2.0--elasticsearch

欢迎关注《Java面试题2.0》合集发布页,持续更新中!

 

 
 
Elasticsearch是什么?
 
Elasticsearch (ES)是一个基于Lucene构建的开源、分布式、RESTful 接口全文搜索引擎。Elasticsearch 还是一个分布式文档数据库,其中每个字段均是被索引的数据且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级的数据。它可以在很短的时间内在储、搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核心发动机。
 
Elasticsearch就是为高可用和可扩展而生的。可以通过购置性能更强的服务器来完成。
 
Elasticsearch的优缺点:
优点:
 横向可扩展性:只需要增加台服务器,做一点儿配置,启动一下Elasticsearch就可以并入集群。
 
分片机制提供更好的分布性:同一个索引分成多个分片(sharding), 这点类似于HDFS的块机制;分而治之的方式可提升处理效率。
 
高可用:提供复制( replica) 机制,一个分片可以设置多个复制,使得某台服务器在宕机的情况下,集群仍旧可以照常运行,并会把服务器宕机丢失的数据信息复制恢复到其他可用节点上。
 
Elasticsearch应用场景
 
大型分布式日志分析系统ELK  elasticsearch(存储日志)+logstash(收集日志)+kibana(展示数据)
大型电商商品搜索系统、网站站内搜索、网盘搜索引擎等。
 
Elasticsearch版本控制是什么?为什么要进行版本控制?
 
1.为什么要进行版本控制CAS无锁
为了保证数据在多线程操作下的准确性
 
2.悲观锁和乐观锁
悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据准确性的操作
乐观锁:假设不会发生并发冲突,只在提交操作是检查是否违反数据完整性。
 
3.内部版本控制和外部版本控制
内部版本控制:_version自增长,修改数据后,_version会自动的加1
 
外部版本控制:为了保持_version与外部版本控制的数值一致
使用version_type=external检查数据当前的version值是否小于请求中的version值
 
es采用的是乐观锁,在提交的时候,利用外部版本控制来保证多线程环境下的数据一致性
 
中文分词器
 
因为Elasticsearch中默认的标准分词器分词器对中文分词不是很友好,会将中文词语拆分成一个一个中文的汉子。因此引入中文分词器-es-ik插件
 
默认的标准分词器会将汉字的每个字都拆成单独的词。
中文分词器的词库也是有限的,是写在配置文件里的,我们可以自定义扩展词库,写在配置文件里即可
 
ES支持哪些类型?
 
基本类型
符串:string,string类型包含 text 和 keyword。
 
text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合。
 
keyword:该类型不需要进行分词,可以被用来检索过滤、排序和聚合,keyword类型自读那只能用本身来进行检索(不可用text分词后的模糊检索)。
keyword 不会进行分词查询,不管是match还是term查询,都不会进行分词以及模糊查询
 
9300与9200区别是什么?
 
9300与9200区别
9300端口: ES节点之间通讯使用
9200端口: ES节点 和 外部 通讯使用
 
9300是TCP协议端口号,ES集群之间通讯端口号
9200端口号,暴露ES RESTful接口端口号
 
什么是DSL语言
 
es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。
由于DSL查询更为直观也更为简易,所以大都使用这种方式。
 
DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式。
 
Term与Match区别是什么?
 
Term查询不会对字段进行分词查询,会采用精确匹配。
Match会根据该字段的分词器,进行分词查询。
 
倒排索引是什么?
 
倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的 ID和字符在该文档中出现的位置情况。
 
由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率。
 
ES为什么要实现集群
 
在单台ES服务器节点上,随着业务量的发展索引文件慢慢增多,会影响到效率和内存存储问题等。
 
我们可以采用ES集群,将单个索引的分片到多个不同分布式物理机器上存储,从而可以实现高可用、容错性等。
 
搭建软件集群的核心思想:
 
配置不同的节点id
配置相同的节点名称
3台服务器实现集群的话,会配置三个不同的elasticsearch.yml
 
ES是如何解决高并发
 
ES是一个分布式全文检索框架,隐藏了复杂的处理机制,内部使用 分片机制、集群发现、分片负载均衡请求路由。
 
Shards 分片:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
 
Replicas分片:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。 当增加或修改数据的时候,只会操作主分片,然后由主分片实时同步刷新数据给副分片;当查询的时候,会在主分片和副分片上进行负载均衡。
 
当通过增加服务器来进行扩容的时候,只需要修改Replicas的值就可以了,通过修改副分片的倍数,来实现所有服务器均摊所有数据的效果,所有的主分片和副分片加在一起的数量,应该是服务器数量的平方。因为主分片的数量在创建之后就不能修改了,所以只能通过操纵副分片的数量来进行修改。
 
单台ES服务器中是没有备用分片的
 
ES集群核心原理分析
 
1、每个索引会被分成多个分片shards进行存储,默认创建索引是分配5个分片进行存储,每个分片都会分布式部署在多个不同的节点上进行部署,该分片成为primary shards 主分片。
   
2、每一个主分片为了实现高可用,都会有自己对应的备分分片, 主分片对应的备分片不能存放同一台服务器上,主分片可以和其他备分片存放在同一个node节点上。
 
3、查询数据的时候,主分片和副分片都可以进行查询, 可以在所有主副分片上进行查询操作,但做添加或修改时,只对主分片进行修改,然后由主分片实时刷新同步给副分片。
 
4、 当加机器水平扩展的时候,要保证所有服务器均摊分片数量,但主分片数量又不能更改,就只能通过修改副分片的倍数来控制。保证所有的主副分片的数量之和是节点数的平方即可。
 
为什么主分片在创建后就不能修改?
 
documnet routing(数据路由)
 
当客户端发起创建document的时候,es需要确定这个document放在该index哪个shard上。这个过程就是数据路由。
路由算法:shard = hash(routing) % number_of_primary_shards
如果number_of_primary_shards在查询的时候取余发生的变化,无法获取到该数据
 
ES集群相关名词
 
Cluster:代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
 
Shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
 
replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
 
Recovery:代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值