model中和index相关的配置
- noIndex,是否对model生成index
- 变更过程 @milai
- true->false,新增index,并且把pg中的数据全部同步到index中
- false->true,删除index,并且删除/失效searchView中的配置
- true->false,新增index,并且把pg中的数据全部同步到index中
- 变更过程 @milai
- 单向关系
- 新增关系数据时,不编辑alias @milai
- 例如,talents和industries为从talents到industries单向的多对多关联。在新增talents和industries的关系时,只需要编辑industries在talents下的alias(workIndustries),不需要编辑talents在industries下的alias
- (later)在curd接口中,不查询/新增/更新单向关系的model @milai
- 在调用查询talents的接口时,可以查询到industries的数据以workIndustries(alias)的字段挂在talents下方返回;在调用新增、更新talents的数据时,可以在提交的数据上带上workIndustries字段,来设置关系;但是,在调用industries的查询/新增/更新接口时,无法把talents以alias的方式挂在industries的数据上
- index时,不生成alias子字段
- 在talents的index中,有workIndustries字段保存关联的industries;但是在industries的index中,没有talents相关的字段
- ** 无法支持任意index(includeLevel)
- 对talents index的index层级是talents.experiences.organization,对organizations index的层级为organizations,对jobs index的层级是jobs.organizations.experiences.talents。这样的需求无法实现,因为关系的单向走向是talents->experiences->organizations-jobs,index时无法从jobs把organizations带出来
- 新增关系数据时,不编辑alias @milai
- (later)自定义index逻辑(例如把company数据直接挂到talent上,而不是通过talent.experience.company这样使用)
- 如何描述该逻辑
- 如何运行该逻辑(index mapping阶段,数据更新阶段)
index结构更新的场景
- 新增model字段
- index操作
- add new field mapping
- reindex with latest mapping
- index操作
- (later)删除model字段
- index操作
- 无操作
- 原字段在index中变为冗余字段
- reindex with latest mapping
- 无操作
- searchView中原字段配置删除/失效
- index操作
- (later)更新model字段
- 更新fieldName
- index操作
- add new field mapping
- 把改名后的字段执行更新mapping到index中
- 原字段在index中变为冗余字段
- reindex with latest mapping
- add new field mapping
- index操作
- 更新fieldType
- index操作
- add new field mapping
- 把更新类型后的字段执行更新mapping到index中
- 原字段在index中变为冗余字段
- reindex with latest mapping
- add new field mapping
- searchView中字段配置删除/失效
- index操作
- 更新fieldName
- 新增model关系(和model直接或间接关联的其他model的关系更新,都会导致当前model需要更新index)@hongbin
- index操作
- add new field mapping
- 新增一个字段时需要把从该字段到底层mapping的完整链路写上,再调用put mapping api。例如,当experiences和organization建立多对一关系时,需要把organization作为子字段放在experiences字段下方,而experiences本来是talents index下的一个字段
`
properties: {
} `experiences: { type: 'nested', properties: { organization: { properties: { name: { type: 'text' }, url: { type: 'text' } } } } }
- 新增一个字段时需要把从该字段到底层mapping的完整链路写上,再调用put mapping api。例如,当experiences和organization建立多对一关系时,需要把organization作为子字段放在experiences字段下方,而experiences本来是talents index下的一个字段
`
properties: {
- reindex with latest mapping
- add new field mapping
- index操作
- (later)删除model关系(和model直接或间接关联的其他model的关系更新,都会导致当前model需要更新index)
- index操作
- 无操作
- 原关系字段在index中变为冗余字段
- reindex with latest mapping
- 无操作
- searchView中原字段配置删除/失效
- index操作
- (later)更新model关系(和model直接或间接关联的其他model的关系更新,都会导致当前model需要更新index)
- 更新alias
- index操作
- add new field mapping
- 和新增model关系的操作类似
- 原关系字段在index中变为冗余字段
- reindex with latest mapping
- add new field mapping
- searchView中字段配置删除/失效
- index操作
- 更新foreignKey
- index操作
- 无操作
- 外键是否同步到index中不重要
- 无操作
- index操作
- 更新willReturn(单向关系)
- index操作
- add new field mapping
- 和新增model关系的操作类似
- 原关系字段在index中变为冗余字段
- reindex with latest mapping
- add new field mapping
- searchView中字段配置删除/失效
- index操作
- 更新alias
model关系依赖树(relationTree)生成逻辑
- code/buildModelRelationTree.js
index结构生成逻辑
- code/buildIndexMapping.js
index数据更新的场景(和model直接或间接关联的其他model的关系更新,都会导致当前model需要更新index)
- 新增model数据
- 更新model数据
- 删除model数据
新增model数据
- 执行更新数据,得到被更新的modelId和数据本身的dataId
- 计算需要更新index的model(modelId)
- 通过遍历上面算法得到的relationTree,可得到需要更新index的modelId
- 例如,当更新了Values表时,通过遍历relationTree,可知道Talents、Orgs、Jobs这三个index都需要更新
- 通过遍历上面算法得到的relationTree,可得到需要更新index的modelId
- 计算需要更新index的model中的具体数据(dataId)
- 遍历relationTree,从被更新的modelId所在节点(Values)到树根节点(Talents、Orgs、Jobs)计算,得到一个完整的sql语句
- 执行sql语句,得到树根节点(Talents、Orgs、Jobs)的dataId
- 计算需要更新index的完整数据
- 把数据写入index
更新model数据
- 需要在更新的过程中,把删掉的modelId和dataId记下来,这部分数据同样需要进行整体的计算
- 后续计算执行的过程和新增model数据流程一样
删除model数据
- 硬删除
- 删除前需要把依赖的modelId+dataId都计算出来,为后续同步做计算
- ?软删除(是否会把关系删掉,只留下主体)
- 如果关系不删除,后面的所有的查询都需要插入isDelete=false
- 如果关系删除,删除前需要把依赖的modelId+dataId都计算出来
- 后续计算执行的过程和新增model数据流程一样
index数据更新算法
(draft)index数据更新的后续优化
- 加入noIndex和单向关系,减少index数据
- 对于瓶颈部分操作,可以运行在独立的服务器,专门做数据同步操作
- 如果对数据更新顺序有需求,可以加入队列,每次只处理一个数据更新的任务