教程
关于 入门 为了搜索,你懂的 安装Elasticsearch 与Elasticsearch交互 面向文档 开始第一步 检索文档 分析 教程小结 分布式的特性 下一步 集群内部工作方式 空集群 集群健康 添加索引 增加故障转移 横向扩展 继续扩展 应对故障 数据吞吐 什么是文档? 索引一个文档 检索文档 检查文档是否存在 更新整个文档 创建一个新文档 删除文档 处理冲突 文档局部更新 检索多个文档 更省时的批量操作 结语 分布式文档存储 路由文档到分片 主分片和复制分片如何交互 新建、索引和删除文档 检索文档 局部更新文档 多文档模式 为什么是奇怪的格式? 搜索——基本的工具 空搜索 多索引和多类别 分页 简易搜索 映射和分析 映射及分析 确切值(Exact values) vs. 全文文本(Full text) 倒排索引 分析和分析器 映射 复合核心字段类型 结构化查询 请求体查询 结构化查询 Query DSL 查询与过滤 最重要的查询过滤语句 查询与过滤条件的合并 验证查询 结语 排序 相关性排序 多值字段字符串排序 相关性简介 数据字段 分布式搜索的执行方式 查询阶段 取回阶段 搜索选项 扫描和滚屏 索引管理 创建索引 索引设置 配置分析器 自定义分析器 类型和映射 根对象 元数据:_source 字段 元数据:_all 字段 文档 ID 动态映射 自定义动态索引 默认映射 重新索引数据 索引别名和零停机时间 入门 使文本可以被搜索 动态索引 近实时搜索 持久化变更 合并段 结构化搜索 查找准确值 组合过滤 查询多个准确值 包含,而不是相等 范围 处理 Null 值 关于缓存 过滤顺序 地理坐标点 地理坐标点 通过地理坐标点过滤 地理坐标盒模型过滤器 地理距离过滤器 缓存地理位置过滤器 减少内存占用 按距离排序 Geohashes Geohashes Geohashes 映射 geohash单元过滤器 地理位置聚合 地理位置聚合 按距离聚合 geohash单元聚合器 范围(边界)聚合器 地理形状 地理形状 映射地理形状 索引地理形状 查询地理形状 在查询中使用已索引的形状 地理形状的过滤与缓存 嵌套 嵌套-对象 嵌套-映射 嵌套-查询 嵌套排序 嵌套-集合

发布于 2016-02-29 14:32:36 | 400 次阅读 | 评论: 0 | 来源: 网络整理

因为per-segment search机制,索引和搜索一个文档之间是有延迟的。新的文档会在几分钟内可以搜索,但是这依然不够快。

磁盘是瓶颈。提交一个新的段到磁盘需要fsync操作,确保段被物理地写入磁盘,即时电源失效也不会丢失数据。但是fsync是昂贵的,它不能在每个文档被索引的时就触发。

所以需要一种更轻量级的方式使新的文档可以被搜索,这意味这移除fsync

位于Elasticsearch和磁盘间的是文件系统缓存。如前所说,在内存索引缓存中的文档(图1)被写入新的段(图2),但是新的段首先写入文件系统缓存,这代价很低,之后会被同步到磁盘,这个代价很大。但是一旦一个文件被缓存,它也可以被打开和读取,就像其他文件一样。

图1:内存缓存区有新文档的Lucene索引 内存缓存区有新文档的Lucene索引

Lucene允许新段写入打开,好让它们包括的文档可搜索,而不用执行一次全量提交。这是比提交更轻量的过程,可以经常操作,而不会影响性能。

图2:缓存内容已经写到段中,但是还没提交 缓存内容已经写到段中,但是还没提交

refeash API

在Elesticsearch中,这种写入打开一个新段的轻量级过程,叫做refresh。默认情况下,每个分片每秒自动刷新一次。这就是为什么说Elasticsearch是近实时的搜索了:文档的改动不会立即被搜索,但是会在一秒内可见。

这会困扰新用户:他们索引了个文档,尝试搜索它,但是搜不到。解决办法就是执行一次手动刷新,通过API:

POST /_refresh <1>
POST /blogs/_refresh <2>
  • <1> refresh所有索引
  • <2> 只refresh 索引blogs

虽然刷新比提交更轻量,但是它依然有消耗。人工刷新在测试写的时有用,但是不要在生产环境中每写一次就执行刷新,这会影响性能。相反,你的应用需要意识到ES近实时搜索的本质,并且容忍它。

不是所有的用户都需要每秒刷新一次。也许你使用ES索引百万日志文件,你更想要优化索引的速度,而不是进实时搜索。你可以通过修改配置项refresh_interval减少刷新的频率:

PUT /my_logs
{
  "settings": {
    "refresh_interval": "30s" <1>
  }
}
  • <1> 每30s refresh一次my_logs

refresh_interval可以在存在的索引上动态更新。你在创建大索引的时候可以关闭自动刷新,在要使用索引的时候再打开它。

PUT /my_logs/_settings
{ "refresh_interval": -1 } <1>

PUT /my_logs/_settings
{ "refresh_interval": "1s" } <2>
  • <1> 禁用所有自动refresh
  • <2> 每秒自动refresh
最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务