Skip to content

Index

Index是为UnifiedStore添加索引的一种方式。索引是一种数据结构,用于快速查找数据。UnifiedStore支持多种索引类型,除了包括基于PostgreSQL的基础索引类型外,还可以添加自定义索引。

自定义索引目前官方实现如下:

  1. BloomFilterIndex:布隆过滤器索引,用于快速判断数据是否存在。
  2. KeywordInvertedIndex:基于关键词的倒排索引,用于快速查找包含关键词的数据。
  3. EmbeddingIndex:基于Embedding的索引,用于快速查找相似数据。
  4. GraphIndex:基于图的索引,用于快速查找关联数据。

自定义索引基类

BaseDPEIndex是所有自定义索引的抽象基类,提供了统一的接口和操作规范,用于对文档(Document)、页面(Page)和元素(Element)进行索引的增、删、改、查等操作。

设计思路

在构建一个复杂的索引系统时,需要考虑以下几个方面:

  1. 统一性:提供统一的接口,使不同类型的索引都能以相同的方式进行操作,方便维护和扩展。

  2. 事务性和回滚机制:在进行索引操作时,可能会出现异常或错误,因此需要提供回滚机制,确保数据的一致性和完整性。

  3. 同步与异步支持:为了适应不同的应用场景,索引操作需要同时支持同步和异步的方式。

  4. 可扩展性:设计成抽象基类,允许开发者根据需要实现自定义的索引类型,满足特定的业务需求。

基类结构

BaseDPEIndex定义了对文档、页面和元素的增删改查操作,每个操作都包括以下方法:

  • 添加操作
  • add_doc / aadd_doc
  • add_page / aadd_page
  • add_element / aadd_element

  • 更新操作

  • update_doc / aupdate_doc
  • update_page / aupdate_page
  • update_element / aupdate_element

  • 删除操作

  • delete_doc / adelete_doc
  • delete_page / adelete_page
  • delete_element / adelete_element

  • 补偿操作(回滚)

  • compensate_add_* / acompensate_add_*
  • compensate_update_* / acompensate_update_*
  • compensate_delete_* / acompensate_delete_*

  • 其他操作

  • rebuild_index / arebuild_index:重建索引。
  • clean_index / aclean_index:清空索引。
  • query / aquery:查询索引。

每个操作都提供了同步和异步版本,以满足不同的使用需求。

回滚机制

在索引操作过程中,可能会发生异常导致操作失败。为了确保数据的一致性,每个操作方法都会返回一个包含回滚信息的字典(如AddDocRollbackInfo)。如果操作失败,可以使用对应的补偿方法(如compensate_add_doc)来执行回滚。

扩展自定义索引

要创建自定义的索引类型,需要继承BaseDPEIndex并实现其中的抽象方法。例如:

class MyCustomIndex(BaseDPEIndex):
    index_type = "my_custom"

    def add_doc(self, doc: SqlDocument, session: Session) -> AddDocRollbackInfo:
        # 实现添加文档的逻辑
        pass

    def compensate_add_doc(self, rollback_info: AddDocRollbackInfo, session: Session) -> None:
        # 实现添加文档的回滚逻辑
        pass

    # 实现其他抽象方法...

注意事项

  • db_hash_id:用于标识索引所在的数据库,在索引关联到存储器时自动设置,不需要手动指定。

  • 异常处理:在实现过程中,需要捕获可能的异常,并抛出DPEOperationException,以便上层调用者进行处理。

  • 注册机制:通过RegisterMap将自定义索引注册到系统中,方便统一管理和调用。

总结

BaseDPEIndex作为自定义索引的基类,提供了统一的接口和规范,支持同步和异步操作,以及完善的回滚机制。通过继承和实现其中的抽象方法,开发者可以根据具体需求创建不同类型的索引,如布隆过滤器索引、倒排索引、向量索引和图索引等。

这种设计方式确保了索引系统的统一性和可扩展性,方便维护和升级,同时也提高了系统的健壮性,确保在异常情况下数据的一致性。