ElasticSearch设计的理念就是分布式搜索引擎。
ES与Solr对比?
Solr在数据量不大的传统搜索应用表现要好于Elasticsearch,这体现在使用简易度上,功能上完整度上,还有少量数据搜索效率上。但Solr毕竟是很久之前的产品,似乎不太适应当前大数据发展的趋势,而Elasticsearch天生支持大数据,并且很多有大数据需求的互联网公司,实际生产环境测试,将搜索服务器从Solr转到Elasticsearch以后的平均查询速度有了50倍的提升。
数据量少的传统搜索应用可以使用Solr,新兴的实时搜索大数据应用选择Elasticsearch。
ES与传统数据库对比?
倒排索引跟普通索引的区别?
普通索引:关键字去找文档
倒排索引:文档去找关键字, 倒排索引是以文档本身内容进行索引,会将所有的原信息整理成一个文档,对这些元信息进行分词,并且对文档进行一个标记。比如当人们搜索hello 关键字的时候,就可以立马定位到 hello 出现在文档1 中,还可以知道在文档中的位置
为什么叫es是准实时的?
准实时。默认是每隔1秒refresh一次的,所以es是准实时的,因为写入的数据1秒之后才能被看到。我们也可以调用es api进行refresh,
手动将buffer中的数据刷入os cache中,让数据立马就可以被搜索到。
ES的数据持久性保证?
translog先写入os cache的,默认每隔5秒刷一次到磁盘中去,可能有5秒的数据会仅仅停留在buffer或者translog文件的os cache中,如果此时机器挂了,会丢失5秒钟的数据。一般使用默认配置,如果使用近实时可能会形象ES的性能。
ES删除流程?
删除操作,commit的时候会生成一个.del文件,里面将某个doc标识为deleted状态,那么搜索的时候根据.del文件就知道这个doc被删除了
Segment File过多会进行什么操作?
buffer每次refresh一次,每秒就会产生一个segment file,segment file会越来越多,到一定程度,此时会定期执行merge,merge时,会将多个segment file合并成一个。同时这里会将标识为deleted的doc物理删除掉,然后将新的segment file写入磁盘,这里会写一个commit point,标识所有新的segment file,然后打开segment file供搜索使用,同时删除旧的segment file。
es里的写流程,有4个底层的核心概念
refresh:buffer快满了,或者到一定时间,就会将buffer数据refresh到一个新的segment file中,但是此时数据不是直接进入segment file的磁盘文件的,而是先进入os cache的。
translog:数据写入ES的时候,不仅写入buff,同时写入到tranlog文件,并且没5秒钟进行一次持久化
flush:默认每隔30分钟会自动执行一次commit,但是如果translog过大,也会触发commit。
1、写commit point;
2、将os cache数据fsync强刷到磁盘上去;
3、清空translog日志文件
merge:buffer每次refresh一次,每秒就会产生一个segment file,segment file会越来越多,到一定程度,此时会定期执行merge,merge时,会将多个segment file合并成一个。
ES插入数据,删除,查询数据流程图
ES优化方案:
1.File System Cache:es的搜索引擎严重依赖于底层的File System Cache,如果给File System Cache更多的内存,尽量让内存可以容纳所有的Index Segment File索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。
2.根据要搜索的字段才存到ES中,尽量避免将所有字段都存到ES中,节约ES的内存。
3.可以使用内存预热方案,用个定时任务之类的工具,将访问频率高的,先查询一遍弄到ES内存中。
整理来自: