最全面的Elasticsearch查询调优

这篇具有很好参考价值的文章主要介绍了最全面的Elasticsearch查询调优。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 将内存分配给文件系统缓存
    ​ Elasticsearch严重依赖文件系统缓存来增加搜索速度,我们要尽量确保至少有一半的可用内存进入文件系统,以便Elasticsearch可以将索引的热点区域保留在屋里内存中。

  2. 使用更快的硬件。

  3. 创建合适的文档索引映射
    ​ 避免连接,nested可以使查询慢几倍,父子关系可以使查询慢数百倍,我们可以尽量通过非规范化文档在不连接的情况下回答相同的问题,则可以显著的提升查询速度。

  4. 搜索尽可能搜索较少的字段
    使用query_string,或者multi_match查询目标越多,速度越慢,提高多个字段的搜索速度可以将多个字段的值复制到一个字段中,在搜索时使用该字段。这种方式可以通过copy_to映射指令来执行,而无需改变文档的来源。比如下面的例子:我们创建一个包含电影名称和电影情节还有名称和情节的一个索引。

    PUT movies
    {
      "mappings": {
        "properties": {
          "name_and_plot": {
            "type": "text"
          },
          "name": {
            "type": "text",
            "copy_to": "name_and_plot"
          },
          "plot": {
            "type": "text",
            "copy_to": "name_and_plot"  //{fields}
          }
        }
      }
    }
    //插入一条数据
    PUT movies/_doc/1
    {
      "name":"水门桥很残酷很残酷",
      "plot":"很残酷很残酷"
    }
    //普通情况我们需要查询多个字段是这样写
    GET movies/_search
    {
      "query": {
        "multi_match": {
          "query": "水门桥",
          "fields": ["name","name_and_plot"]
        }
      }
    }
    //当我们简历索引时添加copy_to,我们只需要查询一个字段就可以
    GET movies/_search
    {
      "query": {
        "match": {
          "name_and_plot": "水门桥 很残酷很残酷"
        }
      }
    }
    //查询结果片段
    "hits" : {
        "total" : {
          "value" : 1,
          "relation" : "eq"
        },
        "max_score" : 3.2364235,
        "hits" : [
          {
            "_index" : "movies",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 3.2364235,
            "_source" : {
              "name" : "水门桥",
              "plot" : "很残酷很残酷"
            }
          }
        ]
      }
    
  5. 预索引数据

    我们可以在你的查询中利用规则来优化数据的索引方式。例如:如果你的文档中包含一个价格字段,并且大多数查询都在固定的范围列表上去聚合,我们可以使用更快的聚合通过将rangs预先写入索引并且通过terms聚合来提升聚合速度。

    例如:创建一个价格索引
    PUT index/_doc/1
    {
      "designation": "spoon",
      "price": 13
    }
    //这时想要查询某个区间的价格数量,需要通过rangs去聚合
    GET index/_search
    {
      "aggs": {
        "price_ranges": {
          "range": {
            "field": "price",
            "ranges": [
              { "to": 10 },
              { "from": 10, "to": 100 },
              { "from": 100 }
            ]
          }
        }
      }
    }
    //如果我们添加一个price_rangs字段创建索引
    PUT index
    {
      "mappings": {
        "properties": {
          "price_range": {
            "type": "keyword"
          }
        }
      }
    }
    //插入一条数据
    PUT index/_doc/1
    {
      "designation": "spoon",
      "price": 13,
      "price_range": "10-100"
    }
    //我们再来求10-100范围内的价格数量,可以使用terms aggregation
    GET index/_search
    {
      "aggs": {
        "price_ranges": {
          "terms": {
            "field": "price_range"
          }
        }
      }
    }
    //聚合结果片段
    "aggregations" : {
        "price_ranges" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [
            {
              "key" : "10-100",
              "doc_count" : 1
            }
          ]
        }
      }
      
    
  6. 避免使用脚本的排序,聚合中的脚本,和script_source查询

  7. 将mapping类型设置为keyword
    并不是所有数值都可以映射为数值字段类型。Elasticsearch优化数字字段,例如intefer或者long,对于一个range查询,keyword字段更适合term或者其他术语(trem_level)
    如果出现以下情况可以将数值字段映射为keyword类型
    ​ a. 不打算使用range查询来搜索标识符数据(id等,标识符一般使用术语级查询来检索)。
    ​ b. term对字段的查询搜索,keyword要比term对数字字段的搜索要快。

  8. 搜索四舍五入的日期

    使用日期字段now查询通常不会被缓存,因为匹配的范围一直在变化。针对用户体验来说,切换到四舍五入的时间通常是可以接受的,并且有利于更好的利用查询的缓存。

    ps:这个案例还没搞明白,回头补充
    
  9. 预热全局序数(global ordinals)
    全局序数是一种用于优化聚合性能的数据结构。它们是惰性计算的,并作为字段数据缓存的一部分存储在JVM堆中。对于大量用于聚合的字段,你可以告诉Elasticsearch在收到请求之前构造和缓存全局序数。如果使用不当会造成堆使用量增加并且使刷新时间更长。

    //设置全局序数
    PUT {index_name}
    {
      "mappings": {
        "properties": {
          "field_name": {
            "type": "keyword",
            "eager_global_ordinals": true
          }
        }
      }
    }
    
  10. 强制合并只读索引
    只读索引可以合并到单个segment中。这基本是基于时间索引的情况:只有当前时间范围的索引正在获取新文档,而旧索引是只读的。已被强制合并为单个字段的分片可以使用更简单,更有效的数据结构来执行搜索。

  11. 预热文件系统缓存
    如果重新启动运行Elasticsearch的机器,文件系统缓存将是空的,因此操作系统将需要一些时间才能将索引的热点区域加载到内存中,以便快速搜索。可以设置文件扩展名明确告诉操作系统那些文件应该被立即加载到内存。

    PUT /{index_name}
    {
      "settings": {
        "index.store.preload": ["nvd", "dvd","格式"]
      }
    }
    
  12. 用preference优化缓存利用率

  13. 使用更快的短语查询index_phrases

  14. 更快的前缀查询index_prefixes

  15. 用户constant_keyword加速过滤

  16. 禁用swap

  17. 避免深度分页,避免单页数据过大,可以参考百度或者淘宝的做法(归根结底就是不让用户查询到10000条以后的数据)。es提供两种解决方案scroll search和search after

  18. 避免使用稀疏数据

  19. 冷热分离的架构设计

  20. fielddata(jvm):搜索时正排索引,doc_value(disk)为index time正排索引,(一般用于聚合查询)。

  21. enabled:是否创建倒排索引

  22. doc_values:正排索引,对于不需要聚合的字段,关闭正排索引可节省资源,提高查询速度

  23. 开启自适应副本选择(ARS),6.1版本支持,7.0默认开启。

参考文献:
https://www.elastic.co/guide/en/elasticsearch/reference/7.13/tune-for-search-speed.html# 调整搜索速度文章来源地址https://www.toymoban.com/news/detail-434424.html

到了这里,关于最全面的Elasticsearch查询调优的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中最全面的统计分布工具

    scipy 为诸多统计分布函数设计了类,这些类封装了几乎相同的方法,下面先以正态分布为示例,预览一下强大的统计功能。 结果如图所示 其中, norm 为正态分布类, rv 是正态分布对象,然后调用 rv.pdf 函数,绘制出 rv 这个标准正态分布的概率密度函数曲线。 接下来通过 r

    2024年02月05日
    浏览(55)
  • 最全面的SpringMVC教程(六)——WebSocket

    本文为 【SpringMVC教程】WebSocket 相关知识介绍,具体将对WebSocket进行简介,并通过实战案例对WebSocket的使用进行详尽介绍~ 📌 博主主页: 小新要变强 的主页 👉 Java全栈学习路线可参考: 【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全

    2024年02月03日
    浏览(46)
  • Postman使用方法指南,最全面的教程

    Postman使用教程 一、Postman介绍 ​ Postman是一个英语单词,名词,作名词时意为“邮递员;邮差”。 ​ Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果, 从而验证响应中的

    2024年02月06日
    浏览(49)
  • 这可能是最全面的Python入门手册了!

    无论是学习任何一门语言,基础知识一定要扎实,基础功非常的重要,找到一个合适的学习方法和资料会让你少走很多弯路, 你的进步速度也会快很多,无论我们学习的目的是什么,不得不说Python真的是一门值得付出时间去学习的优秀编程语言。 Python对于普通人而言,开启

    2024年02月09日
    浏览(50)
  • 【最新综述】史上最全面的3D语义分割综述(上)

            三维分割是计算机视觉领域的一个基本而具有挑战性的问题,可应用于自动驾驶、机器人、增强现实和医学图像分析。它受到了计算机视觉、图形学和机器学习界的极大关注。传统的三维分割方法基于手工创建的特征和机器学习分类器,缺乏泛化能力。在二维计算

    2024年02月20日
    浏览(50)
  • Django ORM:最全面的数据库处理指南

    深度探讨Django ORM的概念、基础使用、进阶操作以及详细解析在实际使用中如何处理数据库操作。同时,我们还讨论了模型深入理解,如何进行CRUD操作,并且深化理解到数据库迁移等高级主题。为了全面解读Django ORM,我们也讨论了其存在的不足,并对其未来发展进行了展望。

    2024年02月13日
    浏览(52)
  • 最全面的Windows 3.1原版系统镜像下载地址

    微软公司发行的操作系统 Windows 3.1是微软公司发布的Windows 3.x系列的基于MS-DOS的操作系统,于1992年4月6日发布。它是微软Windows家族中最具代表性的产品之一,为Windows 95的成功打下了厚实的基础。 此版本添加了对声音输入输出的基本多媒体的支持和一个CD音频播放器,以及对桌

    2024年04月25日
    浏览(33)
  • 最全面的SpringBoot教程(三)——SpringBoot Web开发

    本文为 SpringBoot Web开发 相关内容介绍,下边将对 静态资源管理 (包括: 静态资源访问 , 静态资源前缀 , webjar , 首页支持 ), 请求参数处理 (包括: Rest风格 , 参数注释 ), 数据响应 , 模板引擎 (包括: Thymeleaf模板引擎 , 基本语法 , thymeleaf使用 ), 登录功能

    2023年04月08日
    浏览(32)
  • 2023 年最全面的 DevOps 工具列表,你用过几个?

    在软件开发领域,DevOps已经成为越来越重要的概念。它强调了开发、测试、运维等各个环节之间的协作和自动化,以提高软件交付的速度和质量。随着时间的推移,DevOps所涉及的工具也不断更新和演进。本文将介绍一个预计在 2023 年最全面的 DevOps 工具列表。 1.1 Jenkins Jenkin

    2024年02月15日
    浏览(42)
  • 这可能是最全面的MySQL面试八股文了

    MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。 第一范式1NF 确保数据库表字段的

    2023年04月25日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包