首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《Elasticsearch 源码解析与优化实战》第19章:搜索速度优化

简介 本章讨论搜索速度的优化、搜索速度与系统资源、数据索引方式、查询方式等多个方面,下面我们逐一讨论如何优化搜索速度。...尽量避免使用NFS等远程文件系统,如果NFS比本地存储慢3倍,则在搜索场景下响应速度可能会慢10倍左右。这可能是因为搜索请求有更多的随机访问。...特别是应该避免join操作,嵌套(nested)会使查询慢几倍,父子(parent-child)关系可能使查询慢数百倍,因此,如果可以通过非规范化(denormalizing) 文档来回答相同的问题,则可以显著地提高搜索速度...优化日期搜索 在使用日期范围检索时,使用now的查询通常不能缓存,因为匹配到的范围一直在变化。但是,从用户体验的角度来看,切换到一个完整的日期通常是可以接受的,这样可以更好地利用查询缓存。...当查询只会匹配少量文档时,可以考虑使用map。默认情况下,map只在脚本上运行聚合时使用,因为它们没有序数。

1.5K11

为什么Elasticsearch查询变得这么慢了?

由于我们试图解决的问题涉及慢查询,我们将专注于搜索慢速日志。 但是,如果在索引文档/添加文档时问题解决了性能问题,那么我们将查看索引慢速日志。...4.1 查询时,使用query-bool-filter组合取代普通query 提高搜索性能的一种方法是使用过滤器。 过滤后的查询可能是您最需要的。...您可能希望运行类似“source”的脚本查询: doc ['num'].value.startsWith('1234') 此查询非常耗费资源并且会降低整个系统的速度。...后果就是对应的wildcard Query执行非常慢,非常消耗CPU。...当您遇到麻烦并且群集工作速度比平时慢并且使用大量CPU功率时,您知道需要做一些事情才能使其再次运行。 当Hot Threads API可以为您提供查找问题根源的必要信息。

17.4K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Elasticsearch 检索性能优化实战指南

    2、内存要给到位 Elasticsearch 严重依赖文件系统缓存来加快搜索速度。...且:Nested 可以使查询慢几倍,而父子 Join 类型可以使查询慢数百倍。 大家在建模的时候多考虑,如果不刻意建模全部使用默认字段,看看可能带来的“灾难”性的后果,反过来就能理解建模的重要性。...提高多个字段搜索速度的常用技术是在索引时将它们的值借助 copy_to 复制到单个字段中,然后在搜索时使用该字段。 copy_to 实现了 1 带 2 、1 带 3 甚至 1 带 N 的效果。...Elasticsearch的ETL利器——Ingest节点 12、有效使用 filter 缓存 在 Elasticsearch 查询中有效使用 filter 过滤器可以显着提高搜索性能。...22、设置合理的 Timeout 时间 超时参数和在参数后终止在执行大量搜索或结果数据庞大时非常有用。 在 python 客户端或者 java 客户端连接的时候都建议设置好 Timeout 值。

    1.9K41

    终于踩到了慢查询的坑

    慢查询执行计划.png 优化慢sql一 sync_dt的类型为datetime类型。换另外一种sql写法,直接通过比较日期而不是通过时间戳进行比较。...只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。...使用唯一性索引或主键查找时会发生 (高效) const 当确定最多只会有一行匹配的时候,MySQL优化器会在查询前读取它而且只读取一次,因此非常快。...对于需要计算的值最好通过程序计算好传入而不是在sql语句中做计算,比如这个sql中我们将当前的日期和七天前的日期计算好传入 后记 这个问题当时在测试环境没有发现,测试环境的请求速度还是可以的。..., 分组和多表join的情况, 查询效率不高, 仍需要进行优化,这里出现临时表的原因是数据量过大使用了临时表进行分组运算 优化慢sql二 慢查询的sql业务逻辑为根据时间段分类统计出条件范围内各个时间段的数量

    2K30

    深入搜索之结构化搜索

    结构化搜索是指针对具有内在结构的数据进行检索的过程。比如日期、时间和数字都是结构化的,它们有精确的格式。...精确值查找 进行精确值查找时,使用filters会有比较快的执行速度,而且不会计算相关度,跳过了整个评分的阶段,而且容易被缓存。...elasticsearch有查询表达式---query DSL,在用于查找精确值时,使用term也能达到相同的效果,term可用于数字(numbers)、布尔值(Booleans)、日期(dates)...查找多个精确值 term查询对单个值非常有用,如果要查找价格字段值为20或30的文档时,可以使用多个term查询,也可以使用terms查询。...但字符串却并非如此,要想对其使用范围过滤,Elasticsearch 实际上是在为范围内的每个词项都执行 term 过滤器,这会比日期或数字的范围过滤慢许多。

    2.9K20

    系统设计:索引

    如果有人跟你谈索引,是不是你会第一时间想到数据库,那么索引解决了什么问题?比如查询SQL慢了,发生这种情况时,首先要做的事情之一是查看是否慢SQL走了数据库索引。...在数据库中的特定表上创建索引的目的是使搜索表和查找所需行的速度更快。可以使用数据库表的一列或多列创建索引,方便快速随机查找和高效访问有序记录。...目录像数据库表一样组织,通常有四列:书名、作者、主题和出版日期。通常有两种这样的目录:一种按书名排序,另一种按作者姓名排序。...因此,应避免在表上添加不必要的索引,并删除不再使用的索引。重申一下,添加索引是为了提高搜索查询的性能。...所以是否使用索引的目的在于我们进行权衡,索引是否对我们有帮助,如果只有一条数据记录那么没有索引也可以。如果数据非常庞大,构建了很多冗余索引那么无疑是给我们写入的性能增加了难度。

    1.5K61

    AutoOps 让每个 Elasticsearch 部署的管理变得简单

    虽然 Elasticsearch 是一个功能强大且可扩展的搜索引擎,提供了大量功能,但许多用户发现其管理和维护过程有时非常复杂。我们听到了大家的反馈,并且非常高兴地分享一个好消息!...AutoOps 提供上下文中的 Elasticsearch 命令来解决问题,例如取消长时间运行的搜索任务场景 #2:数据分层使用无效,导致搜索和索引速度慢问题:用户报告搜索性能和索引速度慢。...AutoOps 见解:AutoOps 检测到由于在暖节点上的索引活动导致负载增加,结果是索引队列高和这些节点之一的搜索速度慢。...AutoOps 提供快速深入到检测到的问题的超链接深入屏幕提供了有关节点、索引和分片以及模板优化的额外上下文指标场景 #4:客户 Kibana 仪表板速度慢问题:客户抱怨 Kibana 仪表板有时比平常慢...AutoOps 识别并警告代价高昂的查询、存在的数据类型以及它们何时(或不应该)被使用,例如,将数字存储为整数/长整型,以便为范围查询进行优化。还有许多其他类型的建议,我们希望您会发现它们很有用!

    31241

    30 个 ElasticSearch 调优知识点,都给你整理好了!

    点击关注公众号,Java干货及时送达 ES官方调优指南 第一部分:调优索引速度 第二部分:调优搜索速度 第三部分:通用的一些建议 ES发布时带有的默认值,可为es的开箱即用带来很好的体验。...具体是指 nested 会使得查询慢 好几倍 parent-child关系 更是使得查询慢几百倍 如果 无需join 能解决问题,则查询速度会快很多 4.预索引 数据 根据“搜索数据最常用的方式”来最优化索引数据的方式...如果他们是绝对需要的,你应该使用painless和expressions引擎。 7.搜索rounded 日期 日期字段上使用now,一般来说不会被缓存。...稀疏性 最明显的影响是 对存储的需求(任何doc的每个field,都需要一个byte);但是呢,稀疏性 对 索引速度和查询速度 也是有影响的,因为:即使doc并没有某些字段值,但,索引时,依然需要写这些字段...但,万事都有个但是: 索引时使用了 routing(文档不能平分到每个primary shard 啦) 查询多个索引 索引中文档的个数 非常少 这会导致:参与查询的各个shard,各自的 索引统计 并不相似

    1K21

    Elasticsearch探索:部分匹配

    WITHIN:使用范围字段值完全在查询范围内的文档进行匹配。...lt" : "2014-01-07 00:00:00" } } 当使用它处理日期字段时,range查询支持对日期计算(date math)进行操作,比方说,如果我们想查找时间戳在过去一小时内的所有文档...但字符串却并非如此,要想对其使用范围过滤,Elasticsearch 实际上是在为范围内的每个词项都执行 term 过滤器,这会比日期或数字的范围过滤慢许多。...Regexp Query 正则 Regular Expressions 搜索也即正则搜索是非常耗时的。正则表达式是一种使用 placeholder(称为运算符)匹配数据中的模式的方法。...+ * | { } [ ] ( ) " \ 实际使用 regexp 搜索时,我们必须记住如下的事项: 避免通配符在前面,比如上面的 .*work。

    2.2K41

    扣绩效篇 | 终于踩到了SQL慢查询的坑!

    优化慢SQL sync_dt的类型为datetime类型。换另外一种sql写法,直接通过比较日期而不是通过时间戳进行比较。...通过给查询的数据加10s缓存,响应速度最快平均为20ms explain使用介绍 通过explain,可以查看sql语句的执行情况(比如查询的表,使用的索引以及mysql在表中找到所需行的方式等) 用explain...出现慢查询的原因 在where子句中使用了函数操作 出现慢查询的sql语句中使用了unix_timestamp函数统计出自'1970-01-01 00:00:00'的到当前时间的秒数差。...导致索引全扫描统计出近七天的数据量的 解决方案 尽量避免在where子句中对字段进行函数操作,这将导致存储引擎放弃使用索引而进行全表扫描。...对于需要计算的值最好通过程序计算好传入而不是在sql语句中做计算,比如这个sql中我们将当前的日期和七天前的日期计算好传入 后记 这个问题当时在测试环境没有发现,测试环境的请求速度还是可以的。

    65940

    MySQL数据库实用技巧

    如果进行数值比较,最好使用DECIMAL类型。 日期与时间类型   MySQL对于不同种类的日期和时间有很多的数据类型,比如YEAR和TIME。...CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快,但是它的缺点就是浪费存储空间。所以对存储不大,但在速度上有要求的可以使用CHAR类型,反之可以使用 VARCHAR类型来实现。...在双机热备情况下,可以使用MySQL的二进制日志记录数据的变更,然后将变更部分复制到备份服务器上。 36、如何使用慢查询日志? 慢查询日志主要用来记录查询时间较长的日志。...在开发环境下,可以开启慢查询日志来记 录查询时间较长的查询语句,然后对这些语句进行优化。通过配long_query_time的值,可以灵活地掌握不同程度的慢查询语句。...38、如何使用查询缓冲区?   查询缓冲区可以提高查询的速度,但是这种方式只适合查询语句比较多、更新语句比较少的情况。默认情况下查询缓冲区的大小为0,也就是不可用。

    2.5K10

    告诉你38个MySQL数据库的小技巧!

    如果进行数值比较,最好使用DECIMAL类型。 日期与时间类型 MySQL对于不同种类的日期和时间有很多的数据类型,比如YEAR和TIME。...CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快,但是它的缺点就是浪费 存储空间。所以对存储不大,但在速度上有要求的可以使用CHAR类型,反之可以使用 VARCHAR类型来实现。...在双机热备情况下,可以使用MySQL的二进制日志记录数据的变更,然后将变 更部分复制到备份服务器上。 36、如何使用慢查询日志? 慢查询日志主要用来记录查询时间较长的日志。...在开发环境下,可以开启慢查询日志来记 录查询时间较长的查询语句,然后对这些语句进行优化。通过配long_query_time的值,可以灵活地掌握不同程度的慢查询语句。...38、如何使用查询缓冲区? 查询缓冲区可以提高查询的速度,但是这种方式只适合查询语句比较多、更新语句比较少 的情况。默认情况下查询缓冲区的大小为〇,也就是不可用。

    2.6K10

    sql-索引的作用(超详细)

    事实上,我们完全可以让用户打开系统首页时,数据库仅仅查询这个用户近3个月来未阅览的文件,通过“日期”这个字段来限制表扫描,提高查询速度。...3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度 上面已经谈到:在进行数据查询时都离不开字段的是“日期”还有用户本身的“用户名”。...所以笔者刚开始使用这个存储过程时,感觉非常的不错,速度也比原来的ADO的好。但后来,我又发现了比此方法更好的方法。...虽然在超大容量情况下,这个分页的实现过程是很快的,但在分前几页时,这个1-3秒的速度比起第一种甚至没有经过优化的分页方法速度还要慢,借用户的话说就是“还没有ACCESS数据库速度快”,这个认识足以导致用户放弃使用您开发的系统...在前面的讨论中我们已经提到了,聚集索引有两个最大的优势: 1、以最快的速度缩小查询范围。 2、以最快的速度进行字段排序。 第1条多用在查询优化时,而第2条多用在进行分页时的数据排序。

    82620

    告诉你 38 个 MySQL 数据库的小技巧!

    如果进行数值比较,最好使用 DECIMAL 类型。 日期与时间类型 MySQL 对于不同种类的日期和时间有很多的数据类型,比如 YEAR 和 TIME。...例如,如果有一个 CHAR(255)的列,如果在前 10 个或 30 个字符内,多数值是惟一的,则不需要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间、减少 I/O 操作。...在双机热备情况下,可以使用MySQL的二进制日志记录数据的变更,然后将变 更部分复制到备份服务器上。 36 如何使用慢查询日志 慢查询日志主要用来记录查询时间较长的日志。...在开发环境下,可以开启慢查询日志来记 录查询时间较长的查询语句,然后对这些语句进行优化。通过配 long_query_time 的值,可以灵活地掌握不同程度的慢查询语句。...原则上是只有查询用的字段 才建立索引。 38 如何使用查询缓冲区 查询缓冲区可以提高查询的速度,但是这种方式只适合查询语句比较多、更新语句比较少 的情况。

    2.6K40

    30 个 ElasticSearch 调优知识点,都给你整理好了!

    ES官方调优指南 第一部分:调优索引速度 第二部分:调优搜索速度 第三部分:通用的一些建议 ES发布时带有的默认值,可为es的开箱即用带来很好的体验。...具体是指 nested 会使得查询慢 好几倍 parent-child关系 更是使得查询慢几百倍 如果 无需join 能解决问题,则查询速度会快很多 4.预索引 数据 根据“搜索数据最常用的方式”来最优化索引数据的方式...如果他们是绝对需要的,你应该使用painless和expressions引擎。 7.搜索rounded 日期 日期字段上使用now,一般来说不会被缓存。...这可以提高查询吞吐量并减少搜索量大的应用程序的延迟。 第三部分:通用的一些建议 1、不要 返回大的结果集 es设计来作为搜索引擎,它非常擅长返回匹配query的top n文档。...但,万事都有个但是: 索引时使用了 routing(文档不能平分到每个primary shard 啦) 查询多个索引 索引中文档的个数 非常少 这会导致:参与查询的各个shard,各自的 索引统计 并不相似

    70930

    Elasticsearch学习笔记

    缺少它,部分更新请求不起作用 更新映射文件时,可直接取内容 更易排查错误 怎么禁用:enabled:false 使用:搜索时可以通过_source指定只返回哪些列 元数据_all字段 查询不知道指定哪个字段时...不可被缓存的情况 脚本过滤器,脚本对es是不透明的 Geo(地址)过滤器,不太会被重用 日期范围精确到毫秒不会被缓存,整数会被缓存 过滤时间范围的使用建议 对于时间精确到毫秒的查询,可拆分为日期+日期时间两个过滤条件...* 8 设置为100时,可保证百万级别的数据量误差维持5%以内 小的数据集精度非常高 可配置使用的固定内存量 优化:预先计算hash值,不过性能的瓶颈由聚合时转移到索引时(必须重新建索引,添加hash...可以节省磁盘空间和索引速度 4.2 Fielddata anaylzed的字符串,使用Fielddata这种数据结构支持聚合,fielddata存储在内存堆中,旧版本没有doc values时是用的...不用更新子文档索引 创建删除修改子文档时,不影响父文档和其他文档 劣势 查询速度比嵌套类型慢5-10倍 不适合父文档多的情况 设计父子关系 指定某一文档type为另一文档type的parent 创建父文档时

    1.9K52

    别再说你不会 ElasticSearch 调优了,都给你整理好了

    第二部分-调优搜索速度 第三部分:通用的一些建议 ES发布时带有的默认值,可为es的开箱即用带来很好的体验。...具体是指 a.nested 会使得查询慢 好几倍 b.parent-child关系 更是使得查询慢几百倍 如果 无需join 能解决问题,则查询速度会快很多 预索引 数据 根据“搜索数据最常用的方式”来最优化索引数据的方式...如果他们是绝对需要的,你应该使用painless和expressions引擎。 搜索rounded 日期 日期字段上使用now,一般来说不会被缓存。...这可以提高查询吞吐量并减少搜索量大的应用程序的延迟。 第三部分:通用的一些建议 1、不要 返回大的结果集 es设计来作为搜索引擎,它非常擅长返回匹配query的top n文档。...但,万事都有个但是: 索引时使用了 routing(文档不能平分到每个primary shard 啦) 查询多个索引 索引中文档的个数 非常少 这会导致:参与查询的各个shard,各自的 索引统计 并不相似

    1.2K40

    关系型数据库 MySQL 你不知道的 28 个小技巧

    例如,如果有一个 CHAR(255)的列,如果在前 10 个或 30 个字符内,多数值是惟一的,则不需要对整个列进行索引。 短索引不仅可以提高查询速度而且可以节省磁盘空间、减少 I/O 操作。...在双机热备情况下,可以使用 MySQL 的二进制日志记录数据的变更,然后将变 更部分复制到备份服务器上。 26、如何使用慢查询日志? 慢查询日志主要用来记录查询时间较长的日志。...在开发环境下,可以开启慢查询日志来记 录查询时间较长的查询语句,然后对这些语句进行优化。通过配 long_query_time 的值,可以灵活地掌握不同程度的慢查询语句。...28、如何使用查询缓冲区? 查询缓冲区可以提高查询的速度,但是这种方式只适合查询语句比较多、更新语句比较少 的情况。默认情况下查询缓冲区的大小为 〇,也就是不可用。...只有在查询语句中包含 SQL_NO_CACHE 关键字 时,才不会使用查询缓冲区。可以使用 FLUSH QUERY CACHE 语句来刷新缓冲区,清理查询缓冲区中的碎片。

    1.7K40

    数据库进阶2 Mysql高并发优化

    ,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECTCOL1...比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可...事实上,我们完全可以让用户打开系统首页时,数据库仅仅查询这个用户近3个月来未阅览的文件,通过“日期”这个字段来限制表扫描,提高查询速度。...由此看来,我们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。...3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度 上面已经谈到:在进行数据查询时都离不开字段的是“日期”还有用户本身的“用户名”。

    1.9K10
    领券