花几分钟看一下Elasticsearch原理解析与性能调优( 三 )

  • Quick brown foxes leap over lazy dogs in summer
  • 得到:
    TermDoc_1Doc_2-------------------------Quick||XThe|X|brown|X|Xdog|X|dogs||Xfox|X|foxes||Xin||Xjumped|X|lazy|X|Xleap||Xover|X|Xquick|X|summer||Xthe|X|------------------------倒排面临的挑战
    • Quick跟quick , 用户有可能认为它们是相同的 , 也有可能认为是不同的
    • dog和dogs非常接近 , 在相关性搜索时 , 它们应该都被搜索到
    • jump和leap是同义词 , 在相关性搜索时 , 它们应该都被搜索到
    理解相关性相关性的分数是一个模糊的概念 。 没有精确值 , 没有唯一正确的答案 。 是一种根据各种规则对文档进行的一种量化的估计 。
    它评分的准则如下:
    • 检索词频率检索词在该字段出现的频率越高 , 分数越高
    • 反向文档频率检索词在索引出现的频率越高 , 分数越低
    • 字段长度准则字段的长度越长 , 分数越低
    相关性破坏在使用全文检索某个关键字的时候 , 会出现 , 相关度低的文档的得分高于相关度高的文档的得分 。
    例如检索词milk 。 索引内有两个主分片 , milk在P1出现了5次 , 在P2出现了6次 。 由于P1和P2的词分布不一样 。
    P1的词量比P2的词量高 , 那么milk算在P1出现占比小 , 导致在P1得相关性得分高 , 而在P2 , 占比da , 导致在P2的相关性得分低 。
    原因是因为局部数据分布不均匀导致的
    解决方法
    • 插入更多的文档
    • 使用?search_type=dfs_query_then_fetch进行全局评分 。 但会有严重的性能问题 。 不推荐使用 。
    查询过滤bitset每次使用检索词查询 , 都会为检索词建立一个bitset , bitset包含了匹配的文档的序号 。 在热搜索的检索词 , ES会对这些bitset有针对的进行缓存 , 而不用在再次查询的时候 , 重新查找倒排索引 。
    对于多个查询可以有下图
    花几分钟看一下Elasticsearch原理解析与性能调优文章插图
    当倒排索引重建的时候 , bitset在缓存会自动失效
    缓存的策略
    • 最近256次被使用的bitset , 会被缓存
    • 段内记录小于1w的 , 不会被缓存
    索引管理创建索引可以显式创建 , 也可以隐式创建 。
    在大集群下 , 索引的创建 , 涉及元数据的同步 , 有可能导致集群负载的大量增加 。 此时需要禁用索引的隐式创建
    action.auto_create_index: false删除索引删除索引 , 会涉及大量数据的删除 , 如果用户意外地试图通过一条命令 , 把所有索引删掉 , 这可能导致可怕的后果
    通过禁用此操作 , 可以设置如下
    action.destructive_requires_name: true分析器每个索引都可以设置自己的分析器 , 分析器的用途主要是在全文索引上面 , 通过对不同的语言 , 使用不同的分词 , 不同的词转换来构造倒排索引和计算相关性 。
    分片倒排索引的不变性好处
    • 一旦被读入系统缓存 , 就会一直留在那里 , 直到LRU算法把不常用的倒排索引剔除 。 这对ES的读取性能提供了非常大的提升
    不好
    • 新的文档加入 , 不能增量更新 , 只能重建索引并替换
    如何保证新数据能实时能查询到用更多的索引 。
    对于新的文档 , 不马上重建索引 , 而是通过新增额外的索引 。 在查询数据时 , 通过轮询所有的索引 , 并合并结果返回 。
    花几分钟看一下Elasticsearch原理解析与性能调优文章插图
    ES并不是严格意义上的实时 , 准确来说是准实时 , 由于data从插入到建立倒排索引这段时间 , 新数据是不能访问的
    聚合像数据库的group by 。 只是语法不一样 。 功能相通
    应用层性能调优调大 refresh interval默认刷新时间是1s , 每次刷新都会有一次磁盘写入 , 并创建一个新的段 。 通过设置更大的刷新时间 , 可以让磁盘写入的次数更低 , 写入的段更大 。 减少段合并的次数 。
    禁止OS把ES置换出去OS的内核会在内存紧张的时候 , 把进程置换到外村 。 而对于性能跟内存强相关的ES来说 , 置换到外存是致命的 。 通过设置进程在内核的参数 , 禁止置换 , 可以避免OS的这种动作
    预留大量的文件系统缓存给ES由于ES大部分数据的不变性 , 使得ES的大部分磁盘操作 , 都可以通过文件系统的缓存来加快速度 。 一旦ES的倒排索引和数据缓存到系统 , 如果没有其他进程的干扰 , 而且是比较频繁访问的数据 , 则会一直驻留在系统缓存 , 使得ES的大部分操作都是走内存的 。 一般来说 , 分配一半的内存给文件系统 , 是合适的 。