|
18 | 18 |
|
19 | 19 | from common.config.embedding_config import ModelManage
|
20 | 20 | from common.db.search import native_search
|
21 |
| -from common.db.sql_execute import update_execute |
| 21 | +from common.db.sql_execute import sql_execute, update_execute |
22 | 22 | from common.exception.app_exception import AppApiException
|
23 | 23 | from common.utils.common import get_file_content
|
24 | 24 | from common.utils.fork import Fork
|
| 25 | +from common.utils.logger import maxkb_logger |
| 26 | +from knowledge.models import Document |
25 | 27 | from knowledge.models import Paragraph, Problem, ProblemParagraphMapping, Knowledge, File
|
26 | 28 | from maxkb.conf import PROJECT_DIR
|
27 | 29 | from models_provider.tools import get_model
|
@@ -220,3 +222,44 @@ def get_knowledge_operation_object(knowledge_id: str):
|
220 | 222 | "update_time": knowledge_model.update_time
|
221 | 223 | }
|
222 | 224 | return {}
|
| 225 | + |
| 226 | + |
| 227 | +def create_knowledge_index(knowledge_id=None, document_id=None): |
| 228 | + if knowledge_id is None and document_id is None: |
| 229 | + raise AppApiException(500, _('Knowledge ID or Document ID must be provided')) |
| 230 | + |
| 231 | + if knowledge_id is not None: |
| 232 | + k_id = knowledge_id |
| 233 | + else: |
| 234 | + document = QuerySet(Document).filter(id=document_id).first() |
| 235 | + k_id = document.knowledge_id |
| 236 | + |
| 237 | + sql = f"SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'embedding' AND indexname = 'embedding_hnsw_idx_{k_id}'" |
| 238 | + index = sql_execute(sql, []) |
| 239 | + if not index: |
| 240 | + sql = f"SELECT vector_dims(embedding) AS dims FROM embedding WHERE knowledge_id = '{k_id}' LIMIT 1" |
| 241 | + result = sql_execute(sql, []) |
| 242 | + if len(result) == 0: |
| 243 | + return |
| 244 | + dims = result[0]['dims'] |
| 245 | + sql = f"""CREATE INDEX "embedding_hnsw_idx_{k_id}" ON embedding USING hnsw ((embedding::vector({dims})) vector_l2_ops) WHERE knowledge_id = '{k_id}'""" |
| 246 | + update_execute(sql, []) |
| 247 | + maxkb_logger.info(f'Created index for knowledge ID: {k_id}') |
| 248 | + |
| 249 | + |
| 250 | +def drop_knowledge_index(knowledge_id=None, document_id=None): |
| 251 | + if knowledge_id is None and document_id is None: |
| 252 | + raise AppApiException(500, _('Knowledge ID or Document ID must be provided')) |
| 253 | + |
| 254 | + if knowledge_id is not None: |
| 255 | + k_id = knowledge_id |
| 256 | + else: |
| 257 | + document = QuerySet(Document).filter(id=document_id).first() |
| 258 | + k_id = document.knowledge_id |
| 259 | + |
| 260 | + sql = f"SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'embedding' AND indexname = 'embedding_hnsw_idx_{k_id}'" |
| 261 | + index = sql_execute(sql, []) |
| 262 | + if index: |
| 263 | + sql = f'DROP INDEX "embedding_hnsw_idx_{k_id}"' |
| 264 | + update_execute(sql, []) |
| 265 | + maxkb_logger.info(f'Dropped index for knowledge ID: {k_id}') |
0 commit comments