model中和index相关的配置

  • noIndex,是否对model生成index
    • 变更过程 @milai
      • true->false,新增index,并且把pg中的数据全部同步到index中
        • false->true,删除index,并且删除/失效searchView中的配置
  • 单向关系
    • 新增关系数据时,不编辑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带出来
  • (later)自定义index逻辑(例如把company数据直接挂到talent上,而不是通过talent.experience.company这样使用)
    • 如何描述该逻辑
    • 如何运行该逻辑(index mapping阶段,数据更新阶段)

index结构更新的场景

  • 新增model字段
    • index操作
      • add new field mapping
      • reindex with latest mapping
  • (later)删除model字段
    • index操作
      • 无操作
        • 原字段在index中变为冗余字段
      • reindex with latest mapping
    • searchView中原字段配置删除/失效
  • (later)更新model字段
    • 更新fieldName
      • index操作
        • add new field mapping
          • 把改名后的字段执行更新mapping到index中
          • 原字段在index中变为冗余字段
        • reindex with latest mapping
    • 更新fieldType
      • index操作
        • add new field mapping
          • 把更新类型后的字段执行更新mapping到index中
          • 原字段在index中变为冗余字段
        • reindex with latest mapping
      • searchView中字段配置删除/失效
  • 新增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'
                          }
                      }
                  }
              }
          }
          
          } `
      • reindex with latest mapping
  • (later)删除model关系(和model直接或间接关联的其他model的关系更新,都会导致当前model需要更新index)
    • index操作
      • 无操作
        • 原关系字段在index中变为冗余字段
      • reindex with latest mapping
    • searchView中原字段配置删除/失效
  • (later)更新model关系(和model直接或间接关联的其他model的关系更新,都会导致当前model需要更新index)
    • 更新alias
      • index操作
        • add new field mapping
          • 和新增model关系的操作类似
          • 原关系字段在index中变为冗余字段
        • reindex with latest mapping
      • searchView中字段配置删除/失效
    • 更新foreignKey
      • index操作
        • 无操作
          • 外键是否同步到index中不重要
    • 更新willReturn(单向关系)
      • index操作
        • add new field mapping
          • 和新增model关系的操作类似
          • 原关系字段在index中变为冗余字段
        • reindex with latest mapping
      • searchView中字段配置删除/失效

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都需要更新
  • 计算需要更新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数据
  • 对于瓶颈部分操作,可以运行在独立的服务器,专门做数据同步操作
  • 如果对数据更新顺序有需求,可以加入队列,每次只处理一个数据更新的任务

results matching ""

    No results matching ""