Elasticsearch搜索原理及步骤详细解析是怎样的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计853个文字,预计阅读时间需要4分钟。
Elasticsearch 8.1 中,当进行搜索时,经常会使用索引+星号(如 aaaa-*)的形式进行时间范围搜索。这种查询是如何处理的呢?
- 对匹配的索引进行搜索:当使用 aaaa-* 时,Elasticsearch 会搜索所有以 aaaa 开头的索引。这意味着不仅会搜索 aaaa 这个索引,还会搜索 aaaa_2021, aaaa_2022 等以 aaaa 开头的所有索引。
- 仅基于时间范围的搜索:Elasticsearch 会进一步限制搜索结果,仅包含特定时间范围内的数据。例如,如果你在查询中指定了时间范围,那么即使索引名称符合 aaaa-*,Elasticsearch 也只会返回该时间范围内的文档。
- 无时间范围搜索时:如果查询中没有指定时间范围,那么默认情况下,Elasticsearch 会搜索所有匹配索引下的所有文档,不论其时间。
简而言之,aaaa-* 请求会首先对符合模式的索引进行搜索,然后根据是否存在时间范围来决定搜索的文档。
本文基于elasticsearch8.1。在es搜索中,经常会使用索引+星号,采用时间戳来进行搜索,比如aaaa-*在es中是怎么处理这类请求的呢?是对匹配的进行搜索呢还是仅仅根据时间找出索引,然后才遍历索引进行搜索。在了解其原理前先了解一些基本知识。
SearchTypeQUERY_THEN_FETCH(默认):第一步,先向所有的shard发出请求,各分片只返回排序和排名相关的信息(注意,不包括文档document),然后按照各分片返回的分数进行重新排序和排名,取前size个文档。然后进行第二步,去相关的shard取document。这种方式返回的document与用户要求的size是相等的。
DFS_QUERY_THEN_FETCH:比第1种方式多了一个初始化散发(initial scatter)步骤。
为了能够深刻了解es的搜索过程,首先创建3个索引,每个索引指定一天的一条记录。
POST aaaa-16/_doc
{
"@timestamp": "2022-02-16T16:21:15.000Z",
"word":"16"
}
POST aaaa-17/_doc
{
"@timestamp": "2022-02-17T16:21:15.000Z",
"word":"17"
}
POST aaaa-18/_doc
{
"@timestamp": "2022-02-18T16:21:15.000Z",
"word":"18"
}
即可在kibana上看到3条数据
此时,假设我们用一个索引+星号来搜索,es内部的搜索是怎么样的呢?
GET aaaa*/_search
{
"query": {
"range": {
"@timestamp": {
"gte": "2022-02-18T10:21:15.000Z",
"lte": "2022-02-18T17:21:15.000Z"
}
}
}
}
正好命中一条记录返回。
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "aaaa-18",
"_id" : "0zB2O38BoMIMP8QzHgdq",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2022-02-18T16:21:15.000Z",
"word" : "18"
}
}
]
}
}
一、es的分布式搜索过程
一个搜索请求必须询问请求的索引中所有分片的某个副本来进行匹配。假设一个索引有5个主分片,每个主分片有1个副分片,共10个分片,一次搜索请求会由5个分片来共同完成,它们可能是主分片,也可能是副分片。也就是说,一次搜索请求只会命中所有分片副本中的一个。当搜索任务执行在分布式系统上时,整体流程如下图所示。图片来源Elasitcsearch源码解析与优化实战
搜索入口:整个www.558idc.com/jap.html提供,感恩】
本文共计853个文字,预计阅读时间需要4分钟。
Elasticsearch 8.1 中,当进行搜索时,经常会使用索引+星号(如 aaaa-*)的形式进行时间范围搜索。这种查询是如何处理的呢?
- 对匹配的索引进行搜索:当使用 aaaa-* 时,Elasticsearch 会搜索所有以 aaaa 开头的索引。这意味着不仅会搜索 aaaa 这个索引,还会搜索 aaaa_2021, aaaa_2022 等以 aaaa 开头的所有索引。
- 仅基于时间范围的搜索:Elasticsearch 会进一步限制搜索结果,仅包含特定时间范围内的数据。例如,如果你在查询中指定了时间范围,那么即使索引名称符合 aaaa-*,Elasticsearch 也只会返回该时间范围内的文档。
- 无时间范围搜索时:如果查询中没有指定时间范围,那么默认情况下,Elasticsearch 会搜索所有匹配索引下的所有文档,不论其时间。
简而言之,aaaa-* 请求会首先对符合模式的索引进行搜索,然后根据是否存在时间范围来决定搜索的文档。
本文基于elasticsearch8.1。在es搜索中,经常会使用索引+星号,采用时间戳来进行搜索,比如aaaa-*在es中是怎么处理这类请求的呢?是对匹配的进行搜索呢还是仅仅根据时间找出索引,然后才遍历索引进行搜索。在了解其原理前先了解一些基本知识。
SearchTypeQUERY_THEN_FETCH(默认):第一步,先向所有的shard发出请求,各分片只返回排序和排名相关的信息(注意,不包括文档document),然后按照各分片返回的分数进行重新排序和排名,取前size个文档。然后进行第二步,去相关的shard取document。这种方式返回的document与用户要求的size是相等的。
DFS_QUERY_THEN_FETCH:比第1种方式多了一个初始化散发(initial scatter)步骤。
为了能够深刻了解es的搜索过程,首先创建3个索引,每个索引指定一天的一条记录。
POST aaaa-16/_doc
{
"@timestamp": "2022-02-16T16:21:15.000Z",
"word":"16"
}
POST aaaa-17/_doc
{
"@timestamp": "2022-02-17T16:21:15.000Z",
"word":"17"
}
POST aaaa-18/_doc
{
"@timestamp": "2022-02-18T16:21:15.000Z",
"word":"18"
}
即可在kibana上看到3条数据
此时,假设我们用一个索引+星号来搜索,es内部的搜索是怎么样的呢?
GET aaaa*/_search
{
"query": {
"range": {
"@timestamp": {
"gte": "2022-02-18T10:21:15.000Z",
"lte": "2022-02-18T17:21:15.000Z"
}
}
}
}
正好命中一条记录返回。
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "aaaa-18",
"_id" : "0zB2O38BoMIMP8QzHgdq",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2022-02-18T16:21:15.000Z",
"word" : "18"
}
}
]
}
}
一、es的分布式搜索过程
一个搜索请求必须询问请求的索引中所有分片的某个副本来进行匹配。假设一个索引有5个主分片,每个主分片有1个副分片,共10个分片,一次搜索请求会由5个分片来共同完成,它们可能是主分片,也可能是副分片。也就是说,一次搜索请求只会命中所有分片副本中的一个。当搜索任务执行在分布式系统上时,整体流程如下图所示。图片来源Elasitcsearch源码解析与优化实战
搜索入口:整个www.558idc.com/jap.html提供,感恩】

