(knowledge_id=None, document_id=None)
| 241 | |
| 242 | |
| 243 | def create_knowledge_index(knowledge_id=None, document_id=None): |
| 244 | if knowledge_id is None and document_id is None: |
| 245 | raise AppApiException(500, _('Knowledge ID or Document ID must be provided')) |
| 246 | |
| 247 | if knowledge_id is not None: |
| 248 | k_id = knowledge_id |
| 249 | else: |
| 250 | document = QuerySet(Document).filter(id=document_id).first() |
| 251 | k_id = document.knowledge_id |
| 252 | |
| 253 | sql = f"SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'embedding' AND indexname = 'embedding_hnsw_idx_{k_id}'" |
| 254 | index = sql_execute(sql, []) |
| 255 | if not index: |
| 256 | sql = f"SELECT vector_dims(embedding) AS dims FROM embedding WHERE knowledge_id = '{k_id}' LIMIT 1" |
| 257 | result = sql_execute(sql, []) |
| 258 | if len(result) == 0: |
| 259 | return |
| 260 | dims = result[0]['dims'] |
| 261 | # 超过2000维度不创建索引,pgvector hnsw索引不支持超过2000维度 |
| 262 | if dims < 2000: |
| 263 | sql = f"""CREATE INDEX "embedding_hnsw_idx_{k_id}" ON embedding USING hnsw ((embedding::vector({dims})) vector_cosine_ops) WHERE knowledge_id = '{k_id}'""" |
| 264 | update_execute(sql, []) |
| 265 | maxkb_logger.info(f'Created index for knowledge ID: {k_id}') |
| 266 | |
| 267 | |
| 268 | def drop_knowledge_index(knowledge_id=None, document_id=None): |
no test coverage detected