传统的检索是通过文章,逐个遍历找到对应关键词的位置。 这样就很慢。
ES 的倒排索引的可以理解为标签,形成了词和文章的映射关系表,这种词典+映射表即为倒排索引
倒排索引的底层实现是基于:FST(Finite State Transducer)数据结构
1、 空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;
2、 查询速度快。O(len(str))的查询时间复杂度。
**1、** 关闭缓存 swap;**2、** 堆内存设置为:Min(节点内存/2, 32GB);**3、** 设置最大文件句柄数;**4、** 线程池+队列大小根据业务需要做调整;**5、** 磁盘存储 raid 方式——存储有条件使用 RAID10,增加单节点性能以及避免单节点存储故障。
三、Elasticsearch索引文档的过程第一步:客户写集群某节点写入数据,发送请求。(如果没有指定路由/协调节点,请求的节点扮演**路由节点**的角色。)第二步:节点1接受到请求后,使用文档_id来确定文档属于分片0。请求会被转到另外的节点,假定节点3。因此分片0的主分片分配到节点3上。**文档获取分片过程,借助路由算法获取,路由算法就是根据路由和文档id计算目标的分片id的过程。**第三步:节点3在主分片上执行写操作,如果成功,则将请求并行转发到节点1和节点2的副本分片上,等待结果返回。所有的副本分片都报告成功,节点3将向协调节点(节点1)报告成功,节点1向请求客户端报告写入成功。
四、在并发情况下,Elasticsearch 如果保证读写一致 1、 可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;
2、 另外对于写操作,一致性级别支持 quorum/one/all,默认为 quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。
3、 对于读操作,可以设置 replication 为 sync(默认),这使得操作在主分片和副本分片都完成后才会返回;如果设置 replication 为 async 时,也可以通过设置搜索请求参数_preference 为 primary 来查询主分片,确保文档是最新版本。
要添加新索引,应使用创建索引 API 选项。创建索引所需的参数是索引的配置Settings,索引中的字段 Mapping 以及索引别名 Alias。也可以通过模板 Template 创建索引。
六、安装 Elasticsearch 需要依赖组件ES 早期版本需要JDK,在7.X版本后已经集成了 JDK,已无需第三方依赖。
七、如何使用 Elastic Reporting(收费)Reporting API有助于将检索结果生成 PD F格式,图像 PNG 格式以及电子表格 CSV 格式的数据,并可根据需要进行共享或保存。
八、Elasticsearch 是如何实现 master 选举的 前置前提:
1、 只有候选主节点(master:true)的节点才能成为主节点。
2、 最小主节点数(min_master_nodes)的目的是防止脑裂。
核心入口为 findMaster,选择主节点成功返回对应 Master,否则返回 null。
选举流程大致描述如下:
第一步:确认候选主节点数达标,elasticsearch.yml 设置的值
discovery.zen.minimum_master_nodes;
第二步:比较:先判定是否具备 master 资格,具备候选主节点资格的优先返回;
若两节点都为候选主节点,则 id 小的值会主节点。
注意这里的 id 为 string 类型。
题外话:获取节点 id 的方法。
1GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name2ipport heapPercent heapMax idname
十、Elasticsearch更新和删除文档的过程。 1、 删除和更新也都是写操作,但是Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更;
2、 磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。
3、 在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。
1 动态索引层面
基于模板+时间+rollover api滚动创建索引,举例:设计阶段定义:blog索引的模板格式为:blog_index_时间戳的形式,每天递增数据。这样做的好处:不至于数据量激增导致单个索引数据量非常大,接近于上线2的32次幂-1,索引存储达到了TB+甚至更大。一旦单个索引很大,存储等各种风险也随之而来,所以要提前考虑+及早避免。
2 存储层面
冷热数据分离存储,热数据(比如最近3天或者一周的数据),其余为冷数据。对于冷数据不会再写入新数据,可以考虑定期force_merge加shrink压缩操作,节省存储空间和检索效率。
3 部署层面
一旦之前没有规划,这里就属于应急策略。结合ES自身的支持动态扩展的特点,动态新增机器的方式可以缓解集群压力,注意:如果之前主节点等规划合理,不需要重启集群也能完成动态新增的。
其余基础
1.1合理的硬件配置
SSD (固态硬盘)比 STAT(机械硬盘) 查询效率快5-10 倍 写入差异不大,
如果查询较多 建议内存/硬盘配置为 1:10(SSD)
如果查询较少 建议内存/硬盘配置为 1:50(机械硬盘)
单节点存储数据建议在2TB以内 不要超过5TB
查询主要分为两种类型:精确匹配、全文检索匹配。
精确匹配,例如 term、exists、term set、 range、prefix、 ids、 wildcard、regexp、 fuzzy等。
全文检索,例如match、match_phrase、multi_match、match_phrase_prefix、query_string 等
1、字符串数据类型,包括支持全文检索的 text 类型 和 精准匹配的 keyword 类型。
2、数值数据类型,例如字节,短整数,长整数,浮点数,双精度数,half_float,scaled_float。
3、日期类型,日期纳秒Date nanoseconds,布尔值,二进制(base64编码的字符串)等。
4、范围(整数范围 integer_range,长范围 long_range,双精度范围 double_range,浮动范围 float_range,日期范围 date_range)。
5、包含对象的复杂数据类型,nested 、Object。
6、GEO 地理位置相关类型。
7、特定类型如:数组(数组中的值应具有相同的数据类型)