Index¶
Index是为UnifiedStore添加索引的一种方式。索引是一种数据结构,用于快速查找数据。UnifiedStore支持多种索引类型,除了包括基于PostgreSQL的基础索引类型外,还可以添加自定义索引。
自定义索引目前官方实现如下:
- BloomFilterIndex:布隆过滤器索引,用于快速判断数据是否存在。
- KeywordInvertedIndex:基于关键词的倒排索引,用于快速查找包含关键词的数据。
- EmbeddingIndex:基于Embedding的索引,用于快速查找相似数据。
- GraphIndex:基于图的索引,用于快速查找关联数据。
自定义索引基类¶
BaseDPEIndex是所有自定义索引的抽象基类,提供了统一的接口和操作规范,用于对文档(Document)、页面(Page)和元素(Element)进行索引的增、删、改、查等操作。
设计思路¶
在构建一个复杂的索引系统时,需要考虑以下几个方面:
-
统一性:提供统一的接口,使不同类型的索引都能以相同的方式进行操作,方便维护和扩展。
-
事务性和回滚机制:在进行索引操作时,可能会出现异常或错误,因此需要提供回滚机制,确保数据的一致性和完整性。
-
同步与异步支持:为了适应不同的应用场景,索引操作需要同时支持同步和异步的方式。
-
可扩展性:设计成抽象基类,允许开发者根据需要实现自定义的索引类型,满足特定的业务需求。
基类结构¶
BaseDPEIndex定义了对文档、页面和元素的增删改查操作,每个操作都包括以下方法:
- 添加操作:
add_doc/aadd_docadd_page/aadd_page-
add_element/aadd_element -
更新操作:
update_doc/aupdate_docupdate_page/aupdate_page-
update_element/aupdate_element -
删除操作:
delete_doc/adelete_docdelete_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作为自定义索引的基类,提供了统一的接口和规范,支持同步和异步操作,以及完善的回滚机制。通过继承和实现其中的抽象方法,开发者可以根据具体需求创建不同类型的索引,如布隆过滤器索引、倒排索引、向量索引和图索引等。
这种设计方式确保了索引系统的统一性和可扩展性,方便维护和升级,同时也提高了系统的健壮性,确保在异常情况下数据的一致性。