infinity_adapter.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. """
  2. Infinity 向量数据库适配器
  3. 封装现有的 InfinityClient,实现 VectorDBClient 接口。
  4. """
  5. from typing import Dict, Any, List, Optional
  6. from .base import VectorDBClient
  7. from src.utils.infinity import InfinityClient, get_client as get_infinity_client, close_client as close_infinity_client
  8. from src.conf.settings import vector_db_settings
  9. class InfinityAdapter(VectorDBClient):
  10. """
  11. Infinity 向量数据库适配器
  12. 将现有的 InfinityClient 封装为统一的 VectorDBClient 接口。
  13. """
  14. def __init__(
  15. self,
  16. database: Optional[str] = None,
  17. host: Optional[str] = None,
  18. port: Optional[int] = None,
  19. min_connections: int = 5,
  20. max_connections: int = 10
  21. ):
  22. """
  23. 初始化 Infinity 适配器
  24. Args:
  25. database: 数据库名称
  26. host: Infinity 服务地址
  27. port: Infinity 服务端口
  28. min_connections: 最小连接数
  29. max_connections: 最大连接数
  30. """
  31. self._database = database or vector_db_settings.infinity_database
  32. self._host = host or vector_db_settings.infinity_host
  33. self._port = port or vector_db_settings.infinity_sdk_port
  34. self._min_connections = min_connections
  35. self._max_connections = max_connections
  36. # 获取底层 InfinityClient
  37. self._client: InfinityClient = get_infinity_client(
  38. host=self._host,
  39. port=self._port,
  40. database=self._database,
  41. min_connections=self._min_connections,
  42. max_connections=self._max_connections
  43. )
  44. @property
  45. def client(self) -> InfinityClient:
  46. """获取底层 InfinityClient"""
  47. return self._client
  48. def search(
  49. self,
  50. table_name: str,
  51. output_fields: List[str],
  52. query: Dict[str, Any],
  53. database_name: Optional[str] = None
  54. ) -> Any:
  55. """全文搜索"""
  56. return self._client.search(table_name, output_fields, query, database_name)
  57. def vector_search(
  58. self,
  59. table_name: str,
  60. output_fields: List[str],
  61. query: Dict[str, Any],
  62. database_name: Optional[str] = None
  63. ) -> Any:
  64. """向量搜索"""
  65. return self._client.vector_search(table_name, output_fields, query, database_name)
  66. def hybrid_search(
  67. self,
  68. table_name: str,
  69. output_fields: List[str],
  70. query: Dict[str, Any],
  71. database_name: Optional[str] = None
  72. ) -> Any:
  73. """混合搜索"""
  74. return self._client.hybrid_search(table_name, output_fields, query, database_name)
  75. def insert(
  76. self,
  77. table_name: str,
  78. documents: List[Dict[str, Any]],
  79. database_name: Optional[str] = None
  80. ) -> Any:
  81. """插入文档"""
  82. return self._client.insert(table_name, documents, database_name)
  83. def update(
  84. self,
  85. table_name: str,
  86. cond: str,
  87. data: Dict[str, Any],
  88. database_name: Optional[str] = None
  89. ) -> Any:
  90. """更新文档"""
  91. return self._client.update(table_name, cond, data, database_name)
  92. def get_status(self) -> Dict[str, Any]:
  93. """获取客户端状态"""
  94. return self._client.get_status()
  95. def close(self):
  96. """关闭客户端连接"""
  97. close_infinity_client(self._database)
  98. # ========== Infinity 特有方法(扩展) ==========
  99. def list_databases(self) -> List[str]:
  100. """获取所有数据库"""
  101. return self._client.list_databases()
  102. def list_tables(self, database_name: Optional[str] = None) -> List[str]:
  103. """获取所有表"""
  104. return self._client.list_tables(database_name)
  105. def create_table(
  106. self,
  107. table_name: str,
  108. columns_definition: List[Dict[str, Any]],
  109. database_name: Optional[str] = None
  110. ):
  111. """创建表"""
  112. return self._client.create_table(table_name, columns_definition, database_name=database_name)
  113. def drop_table(self, table_name: str, database_name: Optional[str] = None):
  114. """删除表"""
  115. return self._client.drop_table(table_name, database_name)
  116. def create_index(
  117. self,
  118. table_name: str,
  119. index_name: str,
  120. index_info: Dict[str, Any],
  121. database_name: Optional[str] = None
  122. ):
  123. """创建索引"""
  124. return self._client.create_index(table_name, index_name, index_info, database_name)