Elasticsearch 缓存策略详解:优化你的搜索体验

目录

1. Elasticsearch缓存机制概述

2. 缓存机制的详细解析

2.1 节点查询缓存

2.2 分片请求缓存

2.3 字段数据缓存

2.4 分片查询缓存

3. 合理缓存比例设置

3.1 节点查询缓存

3.2 分片请求缓存

3.3 字段数据缓存

3.4 分片查询缓存

4. 缓存监控与调优

5.实战调优

5.1. 分片请求缓存(Shard Request Cache)

优化建议:

5.2. 节点查询缓存(Node Query Cache)

优化建议:

5.3. 字段数据缓存(Field Data Cache)

优化建议:

5.4. 预热缓存

优化建议:

5.5. 监控和调优

优化建议:

6. 结论


Elasticsearch(简称ES)是一个基于Lucene的分布式搜索和分析引擎,广泛应用于日志和数据分析、全文搜索、安全智能、业务智能等领域。在ES中,缓存机制是其高性能的关键因素之一。本文将详细解析ES的缓存机制,并探讨如何合理设置缓存比例。

1. Elasticsearch缓存机制概述

Elasticsearch的缓存主要分为以下几种:

  1. 节点查询缓存(Node Query Cache):缓存查询结果,特别是过滤器(filter)查询的结果。这种缓存是基于每个分片的,适用于那些经常使用相同过滤器查询的场景。

  2. 分片请求缓存(Shard Request Cache):缓存搜索请求的结果,特别是聚合(aggregation)结果。这种缓存是基于每个分片的,适用于那些经常使用相同搜索请求的场景。

  3. 字段数据缓存(Field Data Cache):缓存字段数据,用于排序、聚合和脚本操作。这种缓存是基于每个分片的,适用于那些经常需要对字段进行排序或聚合的场景。

  4. 分片查询缓存(Shard Query Cache):缓存查询的中间结果,特别是在复杂查询中。这种缓存是基于每个分片的,适用于那些经常使用复杂查询的场景。

2. 缓存机制的详细解析

2.1 节点查询缓存

节点查询缓存主要用于缓存过滤器查询的结果。ES会自动缓存那些频繁使用的过滤器查询,以提高查询性能。节点查询缓存的大小可以通过indices.queries.cache.size参数进行配置,默认值为10%。

2.2 分片请求缓存

分片请求缓存主要用于缓存搜索请求的结果,特别是聚合结果。ES会自动缓存那些频繁使用的搜索请求,以提高查询性能。分片请求缓存的大小可以通过index.requests.cache.size参数进行配置,默认值为1%。

2.3 字段数据缓存

字段数据缓存主要用于缓存字段数据,用于排序、聚合和脚本操作。ES会自动缓存那些频繁使用的字段数据,以提高查询性能。字段数据缓存的大小可以通过indices.fielddata.cache.size参数进行配置,默认值为无限制。

2.4 分片查询缓存

分片查询缓存主要用于缓存查询的中间结果,特别是在复杂查询中。ES会自动缓存那些频繁使用的查询中间结果,以提高查询性能。分片查询缓存的大小可以通过indices.queries.cache.size参数进行配置,默认值为10%。

3. 合理缓存比例设置

合理设置缓存比例是提高ES性能的关键。以下是一些建议:

3.1 节点查询缓存

对于节点查询缓存,建议根据实际查询情况进行调整。如果过滤器查询非常频繁且结果稳定,可以适当增加缓存比例。例如,可以将indices.queries.cache.size设置为20%。

3.2 分片请求缓存

对于分片请求缓存,建议根据实际搜索请求情况进行调整。如果搜索请求非常频繁且结果稳定,可以适当增加缓存比例。例如,可以将index.requests.cache.size设置为2%。

3.3 字段数据缓存

对于字段数据缓存,建议根据实际字段使用情况进行调整。如果字段使用非常频繁且结果稳定,可以适当增加缓存比例。例如,可以将indices.fielddata.cache.size设置为30%。

3.4 分片查询缓存

对于分片查询缓存,建议根据实际查询情况进行调整。如果查询非常频繁且结果稳定,可以适当增加缓存比例。例如,可以将indices.queries.cache.size设置为20%。

4. 缓存监控与调优

为了确保缓存机制的有效性,需要定期监控缓存的使用情况,并根据实际情况进行调优。以下是一些监控和调优的建议:

  1. 监控缓存命中率:通过ES的监控API,可以查看各个缓存的命中率。如果命中率较低,说明缓存效果不佳,需要调整缓存比例或优化查询。

  2. 监控缓存大小:通过ES的监控API,可以查看各个缓存的实际大小。如果缓存大小过大或过小,需要调整缓存比例。

  3. 优化查询:通过优化查询,可以减少缓存的使用,提高查询性能。例如,可以通过合并查询、减少不必要的字段查询等方式进行优化。

5.实战调优

我有一个需求,每天定时全量更新一次索引,其它时间都是读取和查询索引,我们到底要怎么样优化缓存提升查询速度,以下是一些实战分析和优化建议:

5.1. 分片请求缓存(Shard Request Cache)

分片请求缓存 是ES中用于缓存搜索请求结果的机制,特别是对于聚合(aggregation)结果。由于你的场景中大部分时间都是读取索引,分片请求缓存可以显著提高搜索响应速度。

优化建议:
  • 启用分片请求缓存:确保分片请求缓存是启用的。默认情况下,ES会自动缓存那些频繁使用的搜索请求。
  • 调整缓存大小:根据实际情况调整分片请求缓存的大小。可以通过index.requests.cache.size参数进行配置,例如设置为2%或更高,以适应频繁的读取操作。
5.2. 节点查询缓存(Node Query Cache)

节点查询缓存 用于缓存过滤器(filter)查询的结果。由于过滤器查询通常是基于不变的条件,缓存效果会非常好。

优化建议:
  • 启用节点查询缓存:确保节点查询缓存是启用的。默认情况下,ES会自动缓存那些频繁使用的过滤器查询。
  • 调整缓存大小:根据实际情况调整节点查询缓存的大小。可以通过indices.queries.cache.size参数进行配置,例如设置为20%或更高,以适应频繁的读取操作。
5.3. 字段数据缓存(Field Data Cache)

字段数据缓存 用于缓存字段数据,用于排序、聚合和脚本操作。如果你的查询中包含大量的排序或聚合操作,字段数据缓存会非常有用。

优化建议:
  • 启用字段数据缓存:确保字段数据缓存是启用的。默认情况下,ES会自动缓存那些频繁使用的字段数据。
  • 调整缓存大小:根据实际情况调整字段数据缓存的大小。可以通过indices.fielddata.cache.size参数进行配置,例如设置为30%或更高,以适应频繁的读取操作。
5.4. 预热缓存

由于每天只更新一次索引数据,可以在更新索引后立即执行一些常用的查询,以预热缓存。

优化建议:
  • 预热分片请求缓存:在更新索引后,立即执行一些常用的搜索请求,以预热分片请求缓存。
  • 预热节点查询缓存:在更新索引后,立即执行一些常用的过滤器查询,以预热节点查询缓存。
  • 预热字段数据缓存:在更新索引后,立即执行一些常用的排序或聚合操作,以预热字段数据缓存。
5.5. 监控和调优

定期监控缓存的使用情况,并根据实际情况进行调优。

优化建议:
  • 监控缓存命中率:通过ES的监控API,查看各个缓存的命中率。如果命中率较低,说明缓存效果不佳,需要调整缓存比例或优化查询。
  • 监控缓存大小:通过ES的监控API,查看各个缓存的实际大小。如果缓存大小过大或过小,需要调整缓存比例。
  • 优化查询:通过优化查询,减少缓存的使用,提高查询性能。例如,可以通过合并查询、减少不必要的字段查询等方式进行优化。

6. 结论

ES的缓存机制是其高性能的关键因素之一。合理设置缓存比例,并定期监控和调优,可以显著提高ES的查询性能。在实际应用中,需要根据具体的查询情况和数据特点,灵活调整缓存比例,以达到最佳的性能效果。通过本文的详细解析,相信读者对ES的缓存机制有了更深入的了解,并能够根据实际情况合理设置缓存比例,从而提高ES的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区域特征检测工具的使用

区域特征检测工具的使用 选择区域-》右键-》工具->特征检测

实践致知第12享:如何新建一个Word并设置格式

一、背景需求 小姑电话说:要新建一个Word文档,并将每段的首行设置空2格。 二、解决方案 1、在电脑桌面上空白地方,点击鼠标右键,在下拉的功能框中选择“DOC文档”或“DOCX文档”都可以,如下图所示。 之后&#xff0…

Js- Math对象

1.对应的方法 Math.abs(x):返回 x 的绝对值。Math.ceil(x):返回大于或等于 x 的最小整数(向上取整)。Math.floor(x):返回小于或等于 x 的最大整数(向下取整)。Math.round(x):返回 x…

(图文详解)小程序AppID申请以及在Hbuilderx中运行

今天小编给大家带来了如何去申请APPID,如果你是小程序的开发者,就必须要这个id。 申请步骤 到小程序注册页面,注册一个小程序账号 微信公众平台 填完信息后提交注册 会在邮箱收到 链接激活账号 确认。邮箱打开链接后,会输入实…

一、openGauss详细安装教程

一、openGauss详细安装教程 一、安装环境二、下载三、安装1.创建omm用户2.授权omm安装目录3.安装4.验证是否安装成功5.配置gc_ctl命令 四、配置远程访问1.配置pg_hba.conf2.配置postgresql.conf3.重启 五、创建用户及数据库 一、安装环境 Centos7.9 x86openGauss 5.0.1 企业版…

nvm下载

nvm下载 1.下载nvm安装包2.安装nvm3.修改settings.txt4.安装成功5.继续配置 下载nvm之前,你最好将你电脑上的node卸载掉,直接在winx中卸载就行 1.下载nvm安装包 https://github.com/coreybutler/nvm-windows/releases 2.安装nvm 3.修改settings.txt root: E:\nvm\install\nv…

Golang | Leetcode Golang题解之第225题用队列实现栈

题目: 题解: type MyStack struct {queue []int }/** Initialize your data structure here. */ func Constructor() (s MyStack) {return }/** Push element x onto stack. */ func (s *MyStack) Push(x int) {n : len(s.queue)s.queue append(s.queu…

Elasticsearch 8 支持别名查询

在 Elasticsearch 8 中,使用 Java 高级 REST 客户端进行别名管理的过程与之前的版本类似,但有一些API细节上的变化。以下是如何使用 Java 和 Elasticsearch 8 进行别名操作的例子: 引入依赖 确保你的项目中包含了 Elasticsearch 的高级 RES…

关于利用C/C++ 利用编译器RAII机制,在多种编译器及跨平台下得兼容性问题。

在C/C 之中,我们常常利用RAII机制,来处理某个临时块得初始、及利用编译器自动析构,但这可能存在一定的致命性风险,如果你没有遇到,只是你没有过多的进行了解,挨得毒打太小,导致的。 举几个小例子…

08.C2W3.Auto-complete and Language Models

往期文章请点这里 目录 N-Grams: OverviewN-grams and ProbabilitiesN-gramsSequence notationUnigram probabilityBigram probabilityTrigram ProbabilityN -gram probabilityQuiz Sequence ProbabilitiesProbability of a sequenceSequence probability shortcomingsApproxi…

基数排序算法Python实现

1. 基数排序原理和步骤 基数排序是一种非比较型的排序算法,特别适用于处理整数或者字符串等可以分解为多个部分的数据。其基本思想是按位(或字符)进行排序,从最低有效位到最高有效位逐次排序。基数排序常分为LSD(Leas…

字节码编程javassist之生成带有注解的类

写在前面 本文看下如何使用javassist生成带有注解的类。 1:程序 测试类 package com.dahuyou.javassist.huohuo.cc;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import ja…

MyBatisPlus实现增删改查

文章目录 MyBatisPlus实现增删改查基本操作分页查询配置分页插件 MyBatisPlus实现增删改查 实体类GkUser package com.geekmice.springbootselfexercise.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField;…

保姆级教程:Linux (Ubuntu) 部署流光卡片开源 API

流光卡片 API 开源地址 Github:https://github.com/ygh3279799773/streamer-card 流光卡片 API 开源地址 Gitee:https://gitee.com/y-gh/streamer-card 流光卡片在线使用地址:https://fireflycard.shushiai.com/ 等等,你说你不…

0基础学会在亚马逊云科技AWS上搭建生成式AI云原生Serverless问答QA机器人(含代码和步骤)

小李哥今天带大家继续学习在国际主流云计算平台亚马逊云科技AWS上开发生成式AI软件应用方案。上一篇文章我们为大家介绍了,如何在亚马逊云科技上利用Amazon SageMaker搭建、部署和测试开源模型Llama 7B。下面我将会带大家探索如何搭建高扩展性、高可用的完全托管云原…

C++线程安全队列

在 C 中,多线程队列(queue)的实现通常需要考虑线程安全问题,特别是在多个线程需要同时对队列进行操作时。C 标准库中的 std::queue 并不是线程安全的,因此我们需要引入额外的机制来确保线程安全。常用的方法是使用互斥…

FullCalendar的使用,react日历组件

1.下载 yarn add fullcalendar/core fullcalendar/react fullcalendar/daygrid 2.运行 import React from react; import FullCalendar from "fullcalendar/react"; import dayGridPlugin from "fullcalendar/daygrid";const ExperimentalSchedule () …

2024百度之星第三场第一题 数星星

天上有 n 颗星星,每颗星星自第 bi​ 秒开始(包含第 bi​ 秒),每 ai​ 秒便会闪烁一次,小度 今晚有一点失眠,所以他想来数星星,天上的星星每闪烁一次,小度便会在心中记一次数&#xf…

初识STM32:寄存器编程 × 库函数编程 × 开发环境

STM32的编程模型 假如使用C语言的方式写了一段程序,这段程序首先会被烧录到芯片当中(Flash存储器中),Flash存储器中的程序会逐条的进入CPU里面去执行。 CPU相当于人的一个大脑,虽然能执行运算和执行指令,…

hutool ExcelUtil 导出导入excel

引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.15</version></dependency>文件导入 public void savelist(String filepath,String keyname){ExcelReader reader Exce…