ES常见调优手段有哪些?

  • 设计阶段调优
    • 采用冷热分离机制,热数据存储到SSD,提高检索效率;冷数据定期进行shrink操作以缩减存储;
    • 仅针对需要分词的字段,合理的设置分词器;
  • 写入数据调优
    • 写入数据前副本的数量设置为0
    • 自动生成doc ID
    • 合理设置mapping
      • 将不需要索引的字段,index属性设置为not_analyzed或no。对字段不分词,或者不索引。
      • 减少字段内容长度
      • 使用不同的分析器(analyzer),不同的分词器在索引过程中,运算复杂度也有较大的差异
    • 调整_source字段:source字段用于存储doc原始数据,对于部分不需要存储的字段,可以通过includes excludes过滤。这样可以降低I/O的压力。
    • 对analyzed的字段禁用norms,禁用评分。
    • 调整索引的刷新间隔(默认为1秒,强制ES每秒创建一个新segment,从而保证新写入的数据近实时的可见、可被搜索到),比如调整为30s,降低刷新的次数,把刷新操作消耗的系统资源释放出来给index操作使用。
    • 批处理:把多个index操作请求合并到一个batch中去处理,和mysql的jdbc的batch有类似之处。
  • Search(读)调优
    • 数据分组
      • 比如存储日志,索引管理方式一般基于日期、基于天、周、月、年建索引。类似分库分表。
    • 使用filter代替Query
      • Query查询需要为Document的相关度打分,使用Filter,没有打分环节处理,做的事情更少,而且filter理论上更快一些。
      • ID字段定义为keyword
        • 一般情况下,如果ID字段不会被用作Range类型搜索字段,都可以定义成keyword类型。

Elasticsearch的倒排索引是什么?

传统的检索是通过文章,逐个遍历找到对应关键词的位置。
而倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典+映射表即为倒排索引。
学术的解答方式:
倒排索引,相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成—->词典和倒排表。
底层实现:FST数据结构。
lucene从4+版本后开始大量使用的数据结构是FST。有两个优点:

  • 空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间。
  • 查询速度快。O(len(str))的查询时间复杂度。