elasticsearch底层引擎替换之索引创建+文档添加
2017-07-06 21:13
981 查看
最近在改elasticsearch的源码,真的蛋疼,现在先记录一下遇到的问题
首先,我们在做的是替换掉elasticsearch的底层引擎,也就是把lucene替换成我们自己的引擎。这个工作起步不久,所有的一切都是自己一步步来的,除了底层架构,上层的调用也有好多不懂的地方,现在,就我替换的索引建立这一块做个简单的记录。
工作中使用的elasticsearch版本是5.4.2,网上资料比较少。
elasticsearch调用lucene建立索引的入口在elasticsearch/index/engine/internalEngine里,这个internalEngine是分别为每个index的每个分片建立的,如果分片存在的话es初始化的时候,索引recovery的时候就会创建internalengine,否则是在获取到es建立index的命令时创建。关于这个东西不多说,看源码的话这个internalengine里功能有啥还是比较明了的。
今天搞了一天,主要是在对索引添加document的动作选择上,这个是由version这个东西决定的,version,uid,source等几个都是elasticsearch官方文档上讲的元数据,在elasticsearch选择对文档的操作是有很重要的作用。在internalengine里,有个versionmap,会对各个文档的version做个缓存,不过这个map好像很小。在每次添加文档时,internalengine会去查找要添加的文档(uid来指定一个文档)的version,如果version不存在,则代表这个文档还没添加,故调用lucene的adddocument,否则调用updatedocument。注意,它检测version是否存在的时候,首先会检查versionmap,如果versionmap中不存在则会去lucene中检索uid的version(获得version的函数在internalengine的resolveDocVersion里,去lucene检索的函数名叫loadCurrentVersionFromIndex即elasticsearch的这些元数据会随着文档一起存在lucene中,持久化到硬盘上),如果可以在lucene中检测到version一样会认为文档已经存在。我们自己的引擎还暂时没有多个field的功能,所以我做测试的时候一直没法正确的选择对文档的操作。经过一天的检查,终于找到原因。明天我会把除了自定义的json中的field额外还会存进lucene的元数据给贴上来,同时为了自己的引擎测试,先暂用lucene来存储元数据,用户数据交给我们自己的引擎来存储。
元数据有如下内容: _source,_uid,_type,_type,_version,_all(记录的是json自定义的field的内容),_field_names(有多个,会把前面的所有域,包括元数据的域的名字全部记录一遍),目前把元数据存在lucene中没有发现什么bug,
首先,我们在做的是替换掉elasticsearch的底层引擎,也就是把lucene替换成我们自己的引擎。这个工作起步不久,所有的一切都是自己一步步来的,除了底层架构,上层的调用也有好多不懂的地方,现在,就我替换的索引建立这一块做个简单的记录。
工作中使用的elasticsearch版本是5.4.2,网上资料比较少。
elasticsearch调用lucene建立索引的入口在elasticsearch/index/engine/internalEngine里,这个internalEngine是分别为每个index的每个分片建立的,如果分片存在的话es初始化的时候,索引recovery的时候就会创建internalengine,否则是在获取到es建立index的命令时创建。关于这个东西不多说,看源码的话这个internalengine里功能有啥还是比较明了的。
今天搞了一天,主要是在对索引添加document的动作选择上,这个是由version这个东西决定的,version,uid,source等几个都是elasticsearch官方文档上讲的元数据,在elasticsearch选择对文档的操作是有很重要的作用。在internalengine里,有个versionmap,会对各个文档的version做个缓存,不过这个map好像很小。在每次添加文档时,internalengine会去查找要添加的文档(uid来指定一个文档)的version,如果version不存在,则代表这个文档还没添加,故调用lucene的adddocument,否则调用updatedocument。注意,它检测version是否存在的时候,首先会检查versionmap,如果versionmap中不存在则会去lucene中检索uid的version(获得version的函数在internalengine的resolveDocVersion里,去lucene检索的函数名叫loadCurrentVersionFromIndex即elasticsearch的这些元数据会随着文档一起存在lucene中,持久化到硬盘上),如果可以在lucene中检测到version一样会认为文档已经存在。我们自己的引擎还暂时没有多个field的功能,所以我做测试的时候一直没法正确的选择对文档的操作。经过一天的检查,终于找到原因。明天我会把除了自定义的json中的field额外还会存进lucene的元数据给贴上来,同时为了自己的引擎测试,先暂用lucene来存储元数据,用户数据交给我们自己的引擎来存储。
元数据有如下内容: _source,_uid,_type,_type,_version,_all(记录的是json自定义的field的内容),_field_names(有多个,会把前面的所有域,包括元数据的域的名字全部记录一遍),目前把元数据存在lucene中没有发现什么bug,
相关文章推荐
- mongodb底层存储和索引原理——本质是文档数据库,无表设计,同时wiredTiger存储引擎支持文档级别的锁,MMAPv1引擎基于mmap,二级索引(二级是文档的存储位置信息『文件id + 文件内offset 』)
- ElasticSearch创建索引(index)和添加映射(mapping)
- ElasticSearch中head插件安装及创建索引,插入文档,使用
- Elasticsearch创建索引,删除索引,添加mapping
- Solr添加文档到索引
- 分布式搜索elasticsearch java API 之(六)------批量添加删除索引
- InnoDB存储引擎下快速创建索引
- 为MFC单文档视图中创建的CTreeCtrl添加消息响应
- mssql:t-sql;创建表;给表添加约束;使用变量;事务,索引,视图;存储过程
- ElasticSearch封装(创建索引,删除索引,创建Mapping,批量插入,批量删除,搜索)
- mysql 创建 主键索引 唯一索引 全文索引 多列索引 添加索引
- mysql 创建 主键索引 唯一索引 全文索引 多列索引 添加索引
- mysql 创建 主键索引 唯一索引 全文索引 多列索引 添加索引
- mysql 添加索引 mysql 如何创建索引
- sqlserver2005自动创建数据表和自动添加某个字段索引
- 添加计算列,并创建索引
- 这是一个关于XML文档的操作管理器XMLHelper类,类中包括XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现
- 仅img元素创建后不添加到文档中会执行onload事件
- Solr添加文档到索引