一、内存文件系统足够的缓存

Elasticsearch严重依赖于文件系统缓存,以加快搜索速度。通常,您应确保至少有一半的可用内存分配给文件系统缓存,以便Elasticsearch可以将索引的热区保留在物理内存中。

二、使用更快的硬件

如果搜索是受CPU限制的,那就加大CPU。ES对CPU的要求,使用多核CPU优于单核CPU。

如果搜索是在I/O上受限制的话,就需要提供更多的内存和更快的硬盘。SSD硬盘性能优于机械硬盘,本地硬盘性能优于远程虚拟硬盘。

三、文档建模设计

文档应该建模设计,是搜索尽可能的快。避免使用 nested(慢几倍)和父子关系(慢百倍),可以通过对文档进行非规范化的建模设计来达到相同的目的,解决问题。

四、搜索尽可能少的字段

query_stringmulti_match查询目标的字段越多,它的速度就越慢。

五、预索引数据

您应该利用查询中的模式来优化数据索引的方式。例如:你有一个类型的文档所有文档都包含一个字段 price,并且你大多数查询的时候都是使用比较固定的大小范围查询或者聚合,此时如果把这个时间分为预索引到文档中,并且使用terms聚合查询会更快。

例如,你有一类型的数据如下

PUT index/_doc/1
{
"designation": "spoon",
"price": 13
}

并且你搜索的时候经常使用以下范围查询

GET index/_search
{
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 10 },
{ "from": 10, "to": 100 },
{ "from": 100 }
]
}
}
}
}

此时你就应该在文档索引时添加一个price_range字段,并且映射成keyword类型的

PUT index
{
"mappings": {
"_doc": {
"properties": {
"price_range": {
"type": "keyword"
}
}
}
}
}
PUT index/_doc/1
{
"designation": "spoon",
"price": 13,
"price_range": "10-100"
}

然后查询、聚合的时候就使用这个新的字段来代替pricerange聚合

GET index/_search
{
"aggs": {
"price_ranges": {
"terms": {
"field": "price_range"
}
}
}
}

六、将标识符映射为keyword类型

有些字段虽然是数字类型的,但是实际上并不是都要映射为数字类型。ES能够通过数字类型优化range查询,但是terms查询使用keyword更适合。一般的像ISBN(国际标准书号)这样的标识符(ID)都是适合映射为keyword而不是数字的。

七、避免使用脚本

通常,应避免使用脚本。如果绝对需要它们,则应首选painlessexpressions引擎。

八、搜索舍入日期

对日期字段的查询now通常是不可缓存的,因为匹配一直是在变化的。但是,就用户体验而言,切换到舍入日期通常是可以接受的,并且具有更好地利用查询缓存的好处。

例如下面的查询

PUT index/_doc/1
{
"my_date": "2016-05-11T16:30:55.328Z"
}
GET index/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"my_date": {
"gte": "now-1h",
"lte": "now"
}
}
}
}
}
}

可以使用下面的查询代替

GET index/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"my_date": {
"gte": "now-1h/m",
"lte": "now/m"
}
}
}
}
}
}

在这种情况下,我们四舍五入为分钟,因此,如果当前时间为16:31:29,则范围查询将匹配my_date字段值介于15:31:0016:31:59之间的所有内容。而且,如果多个用户在同一分钟内运行包含此范围的查询,则查询缓存可以帮助加快速度。用于舍入的时间间隔越长,查询缓存可以提供的帮助越多,但是请注意,过于激进的舍入也会损害用户体验。

九、强制合并只读索引

只读的索引将从合并到单个段中受益 。对于基于时间的索引,通常是这种情况:只有当前时间范围的索引才能获取新文档,而较旧的索引则为只读。

提示

不要合并正在写入的索引。

十、预热全局序数词

全局序数词是一种数据结构,用于在keyword字段上运行terms聚合 。它们被延迟加载到内存中,因为Elasticsearch不知道terms聚合中将使用哪些字段,而哪些字段则不会。您可以通过如下所述配置映射,让Elasticsearch在刷新时紧急加载全局序数词:

PUT index
{
"mappings": {
"_doc": {
"properties": {
"foo": {
"type": "keyword",
"eager_global_ordinals": true
}
}
}
}
}

十一、预热文件缓存系统

如果重新启动运行Elasticsearch的计算机,则文件系统缓存将为空,因此,操作系统需要一些时间才能将索引的热区加载到内存中,以便快速进行搜索操作。您可以使用该index.store.preload设置明确告诉操作系统哪些文件应该急切地加载到内存中,具体取决于文件扩展名 。

十二、使用索引排序来加快连接的

索引排序可能有用,以便使连接更快,但以稍微慢一些的索引为代价。在索引排序文档中阅读有关它的更多信息。

十三、使用preference以优化缓存利用率

有多个可以帮助提高搜索性能的缓存,例如 文件系统缓存, 请求缓存或查询缓存。但是所有这些缓存都在节点级别维护,这意味着如果您连续两次运行相同的请求,具有一个或多个副本,并使用默认路由算法round-robin,则这两个请求将转到不同的分片副本,从而阻止了节点级缓存的帮助。

由于搜索应用程序的用户通常会依次运行类似的请求(例如为了分析索引的较窄子集),因此使用标识当前用户或会话的首选项值可以帮助优化缓存的使用。

十四、副本可能有助于提高吞吐量,但并非总是可以

除了提高弹性之外,副本还可以帮助提高吞吐量。例如,如果您有一个单碎片索引和三个节点,则需要将副本数设置为2,以便总共拥有3个碎片副本,以便利用所有节点。

现在,假设您有一个2碎片索引和两个节点。在一种情况下,副本数为0,这意味着每个节点都拥有一个分片。在第二种情况下,副本数为1,这意味着每个节点都有两个分片。哪种设置在搜索效果方面效果最好?通常,每个节点的分片总数较少的设置会更好地执行。这样做的原因是,它为每个分片提供了更多的可用文件系统缓存份额,并且文件系统缓存可能是Elasticsearch的第一性能因素。同时,请注意,在单节点故障的情况下,没有副本的安装会失败,因此在吞吐量和可用性之间要进行权衡。

那么正确的副本数是多少?如果您的集群中有num_nodes节点,则总共有 num_primaries主要分片,并且如果您希望max_failures一次最多能处理节点故障,那么适合您的副本数是 max(max_failures, ceil(num_nodes / num_primaries) - 1)

十五、打开自适应副本选择

当存在多个数据副本时,elasticsearch可以使用一组称为自适应副本选择的条件来根据响应时间,服务时间和包含每个碎片副本的节点的队列大小来选择最佳数据副本。这可以提高查询吞吐量并减少大量搜索应用程序的延迟。

ES集群调整搜索速度的更多相关文章

  1. ES 集群调整、升级 最佳实践

    日常应用中我们会经常对es 集群做一些参数调整或者升级版本,但是每次关闭节点再打开 其中的数据同步的痛苦估计有很多人领悟过(有可能出现IO或者网络拥堵导致恶性循环)官网有套方案可以尝试一下: 1.关掉 ...

  2. elasticsearch系列八:ES 集群管理(集群规划、集群搭建、集群管理)

    一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...

  3. ES 集群管理(集群规划、集群搭建、集群管理)

    一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...

  4. ES集群

    1. ElasticSerach集群安装  修改配置文件elasticserach.yml [elk@localhost config]$ vi elasticsearch.yml # ------- ...

  5. 教你在Kubernetes中快速部署ES集群

    摘要:ES集群是进行大数据存储和分析,快速检索的利器,本文简述了ES的集群架构,并提供了在Kubernetes中快速部署ES集群的样例:对ES集群的监控运维工具进行了介绍,并提供了部分问题定位经验,最 ...

  6. ES 集群上,业务单点如何优化升级?

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! ES 基础 ES 集群 ES 集群上业务优化 一.ES 基础 ...

  7. es集群数据库~运维相关

    一 数据同步方案  1 ES-JDBC  不能实现删除同步操作.MYSQL如果删除,ES不会删除  2 logstash-input-jdbc  能实现insert update,但是仍然不能实现删除 ...

  8. ES集群7.3.0设置快照,存储库进行索引备份和恢复等

    说明:三台ES节点组成ES集群,一台kibana主机,版本均是7.3.0,白金试用版 官方地址:https://www.elastic.co/guide/en/elasticsearch/refere ...

  9. 磁盘空间引起ES集群shard unassigned的处理过程

    1.问题描述 早上醒来发现手机有很多ES状态为red的告警,集群就前几天加了几个每天有十多亿记录的业务,当时估算过磁盘容量,应该是没有问题的,但是现在集群状态突然变成red了,这就有点懵逼了. 2.查 ...

随机推荐

  1. centos7中修改运行级别

    centos6 在centos6里打开vim /etc/inittab文件看到下面有一行 id:5:initdefault,因此我们可以通过修改这个文件的id后的数字来修改运行级别 如果我们想要直接切 ...

  2. Java后端开发工程师是否该转大数据开发?

    撰写我对java后端开发工程师选择方向的想法,写给在java后端选择转方向的人 背景 看到一些java开发工程师,对java后端薪酬太悲观了.认为换去大数据领域就会高工资.觉得java后端没有前途.我 ...

  3. Docker深入浅出系列 | Image实战演练

    目录 课程目标 Container与Image核心知识回顾 制作Docker Image的两种方式 Dockerfile常用指令 Image实战篇 通过Dockerfile制作Image 通过Dock ...

  4. 微信小程序没有找到可以构建的npm包

    如果是云开发小程序 ,cmd窗口进入到小程序根目录下的miniprogram目录, 输入npm init 输入包的相关属性,随便输入即可. 完成后会出现一个package.json文件. 如果是其他类 ...

  5. LinearLayout里面的空间居中对齐

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  6. POJ_1979_dfs

    题目描述: 每组数据给你一张字符的图,'@'代表起点,'.'代表可走的路,'#'代表墙,求从起点出发,可到达的位置的数量,包括起点. 思路: dfs基础题,从起始点开始,每一次所在的点,只要不出界并且 ...

  7. 使用canvas制作五子棋游戏

    要制作JS五子棋的话我们可以一开始来理清一下思路,这样对我们后来的编程是有好处的 1.棋盘使用canvas制作.canvas用来做这种不用太过复杂的图形的时候是很有用处的,下图是我制作的一个五子棋棋盘 ...

  8. window10 vs2013 SIFTGPU

    碰到的问题: 1.一大推语法错误: 所有For_EACH_OCTAVE的地方都出现了语法错误.后来查找了一下For_EACH_OCTAVE是个啥,发现是一个宏定义,也不知道宏定义定义的好好的,为啥会编 ...

  9. python中调用函数时,参数顺序与参数赋值问题

    设置类和函数如下:class MM(): def ff(self,url(1),method(2),data=None(3),cookie=None(4)): if method.lower()==& ...

  10. [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?

    在 Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity. 所有对象的非同步 方法都能够在任意时刻被任意线 ...