elasticsearch原理及常见面试点

Elastic logo

elasticsearch是基于Lucene 倒排索引结构的一款OLAP数据分析引擎,特点是快速,并且支持模糊查询。

模糊查询基于倒排索引:

倒排索引原理:

图解 ElasticSearch 原理

  • 集群cluster中包含很多nodes
  • 一个或多个node中的shard组成index索引=lucene index
  • lucene index由许多的segments组成
  • segment内部结构由多个部分组成,最最重要的 Inverted Index
  • 增加文件可能会使索引所占空间变小,它会引起 Merge,从而可能会有更多的压缩。

Inverted Index 主要包括两部分:

  • 一个有序的数据字典 Dictionary(包括单词 Term 和它出现的频率)
  • 与单词 Term 对应的 Postings(即存在这个单词的文件)

当我们搜索的时候,首先将搜索的内容分解,然后在字典里找到对应 Term,从而查找到与搜索相关的文件内容。

在 Shard 中搜索

ElasticSearch 从 Shard 中搜索的过程与 Lucene Segment 中搜索的过程类似。

需要注意的是:1 次搜索查找 2 个 Shard=2 次分别搜索 Shard

Shard 不会进行更进一步的拆分,但是 Shard 可能会被转移到不同节点上。

如果当集群节点压力增长到一定的程度,我们可能会考虑增加新的节点,这就会要求我们对所有数据进行重新索

引,这是我们不太希望看到的。所以我们需要在规划的时候就考虑清楚,如何去平衡足够多的节点与不足节点之间

的关系。


一个真实的请求

请求分发:这个请求可能被分发到集群里的任意一个节点,如下图:

上帝节点:


这时这个节点就成为当前请求的协调者(Coordinator),它决定:
根据索引信息,判断请求会被路由到哪个核心节点。
以及哪个副本是可用的。
等等。

路由:

在真实搜索之前ElasticSearch 会将 Query 转换成 Lucene Query,如下图:

然后在所有的 Segment 中执行计算,如下图:

对于 Filter 条件本身也会有缓存,如下图:

但 Queries 不会被缓存,所以如果相同的 Query 重复执行,应用程序自己需要做缓存。

所以Filters 可以在任何时候使用。Query 只有在需要 Score 的时候才使用。

搜索结束之后,结果会沿着下行的路径向上逐层返回,如下图:




常见面试问题:

kafka-flink-es过程中,flink自定义sink可以使用基于哪两种方式发送?

1、http方式

2、jdbc方式


字段全值匹配检索如果在关系型数据库Mysql中查询多字段匹配数据(字段检索)一般会执行下面的SQL语句:

1
select * from atguigu where name = 'haha';

但在Elasticsearch中需要采用特殊的方式:

1
2
3
4
5
6
7
8
9
10
11
12
GET atguigu/_search
{
"query": {
"bool": {
"filter": {
"term": {
"about": "I love to go rock climbing"
}
}
}
}
}

字段分词匹配检索

1
2
3
4
5
6
7
8
GET atguigu/_search
{
"query": {
"match": {
"about": "I"
}
}
}

字段模糊匹配检索如果在关系型数据库Mysql中模糊查询多字段数据一般会执行下面的SQL语句:

1
select * from user where name like '%haha%';

但在Elasticsearch中需要采用特殊的方式,查询出所有文档字段值分词后包含haha的文档:

1
2
3
4
5
6
7
8
9
10
GET  test/_search
{
"query": {
"fuzzy": {
"aa": {
"value": "我是程序"
}
}
}
}
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2020-2021 ycfn97
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信