Elasticsearch7.8.0版本进阶——近实时搜索

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch7.8.0版本进阶——近实时搜索相关的知识,希望对你有一定的参考价值。

目录

一、近实时搜索的概述

1.1、按段(per-segment)搜索

  • 随着按段(per-segment)搜索的发展,一个新的文档从索引到可被搜索在几分钟之内即可被检索,但这样还是不够快。因为磁盘成为了瓶颈。
  • 提交(Commiting)一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,在断电的时候就不会丢失数据。 但是 fsync 操作代价很大; 如果每次索引一个文档都去执行一次的话会造成很大的性能问题。

1.2、更轻量的方式搜索

  • 在 Elasticsearch 和磁盘之间是文件系统缓存,新段会被先写入到文件系统缓存,稍后再被刷新到磁盘。

  • 不过只要文件已经在缓存中,就可以像其它文件一样被打开和读取了。使其包含的文档在未进行一次完整提交时便对搜索可见,并且在不影响性能的前提下可以被频繁地执行。

二、为什么Elasticsearch是 近 实时搜索

  • 在 Elasticsearch 中,写入和打开一个新段的轻量的过程叫做 refresh 。 默认情况下每个分片会每秒自动刷新一次。
  • 文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。

三、如何解决索引了一个文档然后却没有搜到

  • 使用 refresh API 执行一次手动刷新: /users/_refresh
  • 尽管刷新是比提交轻量很多的操作,它还是会有性能开销。当写测试的时候, 手动刷新很有用,但是不要在生产环境下每次索引一个文档都去手动刷新

四、哪种情况不需要每秒刷新

4.1、使用 Elasticsearch 索引大量的日志文件

  • 可能只想优化索引速度而不是近实时搜索, 可以通过设置 refresh_interval , 降低每个索引的刷新频率。

    
    	"settings": 
    		"refresh_interval": "30s"
    	
    
    

4.2、使用 Elasticsearch建立一个大的新索引时

  • refresh_interval 可以在既存索引上进行动态更新。

  • 在生产环境中,当你正在建立一个大的新索引时,可以先关闭自动刷新。

    # 关闭自动刷新
    PUT /users/_settings
     
    	"refresh_interval": -1 
    
    
  • 然后,待开始使用该索引时,再设置自动刷新。

    # 每一秒刷新
    PUT /users/_settings
     
    	"refresh_interval": "1s" 
    
    

以上是关于Elasticsearch7.8.0版本进阶——近实时搜索的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch7.8.0版本进阶——核心概念

Elasticsearch7.8.0版本进阶——倒排索引

Elasticsearch7.8.0版本进阶——分片控制

Elasticsearch7.8.0版本进阶——分布式集群(故障转移)

Elasticsearch7.8.0版本进阶——持久化变更

Elasticsearch7.8.0版本进阶——数据更新流程