Elasticsearch实战 | 必要的时候,还得空间换时间!

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 1、应用场景实时数据流通过kafka后,根据业务需求,一部分直接借助kafka-connector入Elasticsearch不同的索引中。另外一部分,则需要先做聚类、分类处理,将聚合出的分类结果存入ES集群的聚类索引中。如下图所示:业务系统的分层结构可分为:接入层、数据处理层、数据存储层、接口层。那么问题来了?我们需要基于聚合(数据处理层)的结果实现检索和聚合分析操作,如何实现更快的检索和更高效的聚合分析效果呢?

image.png

2、方案选型

方案一:

只建立一个索引,aggs_index。

数据处理层的聚合结果存入ES中的指定索引,同时将每个聚合主题相关的数据存入每个document下面的某个field下。如下示意图所示:

image.png

方案二:

新建两个索引:aggs_index以及aggs_detail_index。

其中:

1)aggs_index存储事件列表信息。

2)aggs_detail_index存储事件关联的文章内容信息。

如下图所示:

image.png

3、方案对比

方案一优点:节省存储空间,只存储关联文章id,数据没有重复存储。

方案一缺点:检索、聚合慢,性能不能达标。

方案一后续的所有操作,都需要先遍历检索这一堆IDs,然后再进行检索、聚合分析操作。


操作实例如下(实际比这要复杂):

第一步:通过事件id,获取关联文章id列表;

第二步:基于关联文章id列表,进行检索和聚合操作。


POST  aggs_index/_search

{

 "_source": {

 "includes":[

   "title",

"abstract",

"publish_time",

"author"

   ]},

 "query":{

   "terms":{

     "_id":"["789b4cb872be00a04560d95bf13ec8f42c",

     "792d9610b03676dc5644c2ff4db372dec4",

"817f5cff3dd0ec3564d45615f940cb7437",

"....."]

   }

 }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

步骤2当id数量很多时,会有如下的错误提示:


{

 "error": {

   "root_cause": [

     {

       "type": "too_many_clauses",

       "reason": "too_many_clauses:

       maxClauseCount is set to 1024"

     },

1

2

3

4

5

6

7

8

。。。


方案二优点:分开存储,便于一个索引中进行检索、聚合分析操作。

空间换时间,极大的提升检索效率、聚合速度。

方案二缺点:同样的数据,多存储了一份。

其对应的检索操作如下:


POST  aggs_index/_search

{

 "_source": {

 "includes":[

   "title",

"abstract",

"publish_time",

"author"

   ]},

 "query":{

   "term":{

     "topic_id":"WIAEgRbI0k9s1D2JrXPC"

   }

 }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

是真的吗?

用事实说话:

以下响应时间的单位为:ms。

方案一要在N个(N接近10)索引,每个索引近千万级别的数据中检索。image.png

4、小结

  • 由以上图示,对比可知,方案二采取了时间换空间的策略,数据量多存储了一份,但是性能提升了10余倍。
  • 在实战开发中,我们要理性的选择存储方案,在磁盘成本日渐低廉的当下,把性能放在第一位,用户才能用的”爽“!
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
7月前
elasticsearch使用 scroll 滚动分页实战实例
elasticsearch使用 scroll 滚动分页实战实例
270 0
|
5月前
|
存储 数据采集 数据处理
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
189 12
|
6月前
|
缓存 数据处理 数据安全/隐私保护
Elasticsearch索引状态管理实战指南
Elasticsearch索引状态管理实战指南
|
6月前
|
存储 索引
Elasticsearch索引之嵌套类型:深度剖析与实战应用
Elasticsearch索引之嵌套类型:深度剖析与实战应用
|
7月前
|
人工智能 自然语言处理 开发者
Langchain 与 Elasticsearch:创新数据检索的融合实战
Langchain 与 Elasticsearch:创新数据检索的融合实战
204 10
|
6月前
|
存储 JSON 搜索推荐
Springboot2.x整合ElasticSearch7.x实战(三)
Springboot2.x整合ElasticSearch7.x实战(三)
53 0
|
6月前
|
存储 自然语言处理 关系型数据库
Springboot2.x整合ElasticSearch7.x实战(二)
Springboot2.x整合ElasticSearch7.x实战(二)
53 0
|
6月前
|
搜索推荐 数据可视化 Java
Springboot2.x整合ElasticSearch7.x实战(一)
Springboot2.x整合ElasticSearch7.x实战(一)
50 0
|
7月前
|
消息中间件 Java 关系型数据库
【二十】springboot整合ElasticSearch实战(万字篇)
【二十】springboot整合ElasticSearch实战(万字篇)
1089 47
|
7月前
|
存储 缓存 监控
干货 | Elasticsearch 8.X 性能优化实战
干货 | Elasticsearch 8.X 性能优化实战
662 2