搜索引擎(ElasticSearch)是什么?[面试5.0]
Elasticsearch:分布式的全文搜索引擎,主要解决已下几个问题:
解决海量数据中执行搜索时使用如MySql等数据库查询效率低下的问题
解决输入关键字顺序不正确时,同样能搜到正确的数据的问题
解决搜索时不能以特定标记展示的问题(如:红色字体展示)
全文检索:
将一段词语分词并放到分词库,搜索时根据关键字在分词库中检索(也是倒排索引)
解释一下什么是倒排索引?[面试7.0]
就是根据值搜索id,倒过来的,倒排表结构如下:
四川|省|发生|地震
湖南|省|出现|旱灾
term | freq | docid |
---|---|---|
四川 | 1 | 1 |
湖南 | 1 | 2 |
省 | 2 | 1,2 |
发生 | 1 | 1 |
出现 | 1 | 2 |
地震 | 1 | 1 |
旱灾 | 1 | 2 |
倒排表按顺序存储在倒排文件中,倒排文件存在磁盘上
ES的二级索引FST是什么,ES怎么查询数据的?[面试7.0]
ES查询数据底层原理
由于Lucene会为原始数据中的每个词都生成倒排索引,数据量大,所以倒排索引对应的倒排表被存放在磁盘上,若每次查询都直接读取磁盘的话,会有多次磁盘IO,严重影响查询性能,Lucene便引入了二级索引FST(Finite State Transducer)
FST的结构类似前缀树,其原理如下:
将原本的分词表,拆分成多个Block,每个Block包含25 -48个词(Term),Block的词具有相同前缀(Allen和After组成一个Block)
将每个Block中的公共前缀抽取出来(Allen和After的公共前缀是A),按照类似前缀树的逻辑组合成FST,其叶子节点携带对应Block的首地址
为了加速查询,FST永驻堆内内存,无法被GC回收
用户查询时,先通过关键词(Term)查询内存中的FST,找到该Term对应的Block首地址,再读取磁盘上的倒排表(分词表),将该Block加载到内存,遍历该Block,查找到目标Term对应的DocId,再按照一定的排序规则,生成DocId优先级队列,再按该队列的顺序读取磁盘中的原始数据
ElasticSearch的(from+size)查询数据的原理是什么?[面试6.0]
from+size查询模式二则之和超过1W查询效率会非常低下
1.将用户指定的关键词进行分词
2.将词汇拿到分词库进行检索,得到多个文档id
3.到各个分片中拉取数据
4.将数据根据score进行排序
5.根据from的值,将查询到的数据舍弃一部分
6.返回最终结果
ElasticSearch的(scroll+size)查询数据的原理是什么?[面试6.0]
scroll+size查询模式适合非实时数据的查询,这样查询效率高于from+size
1.将用户指定的关键词进行分词
2.将词汇拿到分词库进行检索,得到多个文档id
3.将文档id存放到ES上下文中
4.根据指定的size个数到ES中检索数据,拿完数据的文档id,就将这些id在上下文中移除
5.若需要下一页数据就直接到ES上下文中找后续内容