From 96dbe9692108d9705fb6d1dc5d4037e2bd744eca Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Tue, 19 Aug 2025 13:31:18 +0800 Subject: [PATCH] 'commit' --- dsSchoolBuddy/Config/Config.py | 10 +-- .../Config/__pycache__/Config.cpython-310.pyc | Bin 831 -> 852 bytes .../ElasticSearch/T1_RebuildMapping.py | 31 +++++-- .../ElasticSearch/Utils/EsSearchUtil.py | 79 ++++++++++++------ .../__pycache__/EsSearchUtil.cpython-310.pyc | Bin 12197 -> 12791 bytes 5 files changed, 83 insertions(+), 37 deletions(-) diff --git a/dsSchoolBuddy/Config/Config.py b/dsSchoolBuddy/Config/Config.py index 94344ebc..df3206a5 100644 --- a/dsSchoolBuddy/Config/Config.py +++ b/dsSchoolBuddy/Config/Config.py @@ -1,10 +1,10 @@ # Elasticsearch配置 ES_CONFIG = { - "hosts": "https://127.0.0.1:9200", - "basic_auth": ("elastic", "jv9h8uwRrRxmDi1dq6u8"), - "verify_certs": False, - "ssl_show_warn": False, - "index_name": "ds_kb" + 'hosts': ['https://localhost:9200'], + 'basic_auth': ('elastic', 'jv9h8uwRrRxmDi1dq6u8'), + 'verify_certs': False, + 'index_name': 'ds_db', # 默认索引名称 + 'student_info_index': 'student_info' # 添加student_info索引名称配置 } # 嵌入向量模型 diff --git a/dsSchoolBuddy/Config/__pycache__/Config.cpython-310.pyc b/dsSchoolBuddy/Config/__pycache__/Config.cpython-310.pyc index e08dddfa2d8484bb71959dd5bcf8508175e52c86..22c831f6d96cb94f07dd73765e83b5549a1ef46d 100644 GIT binary patch delta 221 zcmdnbc7=^MpO=@50SLr-mSh~C$SWJ|1mvVJq%)>4rZA;2r?8~3&S8yWNMVa&Oks~= zO5uoNPT`DVN#TlOP2rAWOW}!P2a0o~@J4Z_@I`T@@JDf{2m~`|3Ra0_l#~<{Tj}fP zTQWaJl@Ol;N(PDzU5DK05ZNzE&X&&*59*JQoL3X&_1;z~*^&PsoqUh=%N*7yh7{H)#uT?s z0T3EaY}IkdPSRw(#hQ^{TvB|CD=D!!GdVu7v?SvePg!bFW?E%@a%vG!hPSvlC%!l% tzdXJ?u_*5rS7u&HYDIirVs7eY7RGywZ0tZM7O_u$!Q{orG})M05dby* diff --git a/dsSchoolBuddy/ElasticSearch/T1_RebuildMapping.py b/dsSchoolBuddy/ElasticSearch/T1_RebuildMapping.py index 271bd24f..f0eb0d62 100644 --- a/dsSchoolBuddy/ElasticSearch/T1_RebuildMapping.py +++ b/dsSchoolBuddy/ElasticSearch/T1_RebuildMapping.py @@ -4,8 +4,29 @@ from ElasticSearch.Utils.EsSearchUtil import EsSearchUtil # 创建EsSearchUtil实例 search_util = EsSearchUtil(Config.ES_CONFIG) -# 调用重建mapping方法 -if search_util.rebuild_mapping(): - print("重建mapping操作完成成功") -else: - print("重建mapping操作失败") \ No newline at end of file +def rebuild_index(index_name): + """ + 重建指定的索引 + + 参数: + index_name: 要重建的索引名称 + + 返回: + bool: 操作是否成功 + """ + print(f"开始重建索引: {index_name}") + if search_util.rebuild_mapping(index_name): + print(f"重建索引 '{index_name}' 操作成功") + return True + else: + print(f"重建索引 '{index_name}' 操作失败") + return False + +if __name__ == "__main__": + # 重建ds_db索引 + rebuild_index(Config.ES_CONFIG['index_name']) + + # 重建student_info索引 + rebuild_index(Config.ES_CONFIG['student_info_index']) + + print("所有索引重建操作完成") \ No newline at end of file diff --git a/dsSchoolBuddy/ElasticSearch/Utils/EsSearchUtil.py b/dsSchoolBuddy/ElasticSearch/Utils/EsSearchUtil.py index 717cb22b..77e1e440 100644 --- a/dsSchoolBuddy/ElasticSearch/Utils/EsSearchUtil.py +++ b/dsSchoolBuddy/ElasticSearch/Utils/EsSearchUtil.py @@ -6,7 +6,6 @@ import time import requests -from Config.Config import ES_CONFIG from ElasticSearch.Utils.ElasticsearchConnectionPool import ElasticsearchConnectionPool from langchain_core.documents import Document from langchain_text_splitters import RecursiveCharacterTextSplitter @@ -41,10 +40,13 @@ class EsSearchUtil: self.index_name = es_config['index_name'] logger.info(f"EsSearchUtil初始化成功,索引名称: {self.index_name}") - def rebuild_mapping(self): + def rebuild_mapping(self, index_name=None): """ 重建Elasticsearch索引和mapping结构 + 参数: + index_name: 可选,指定要重建的索引名称,默认使用初始化时的索引名称 + 返回: bool: 操作是否成功 """ @@ -52,43 +54,66 @@ class EsSearchUtil: # 从连接池获取连接 conn = self.es_pool.get_connection() + # 使用指定的索引名称或默认索引名称 + target_index = index_name if index_name else self.index_name + logger.info(f"开始重建索引: {target_index}") + # 定义mapping结构 - mapping = { - "mappings": { - "properties": { - "embedding": { - "type": "dense_vector", - "dims": Config.EMBED_DIM, # embedding维度为Config.EMBED_DIM - "index": True, - "similarity": "l2_norm" # 使用L2距离 - }, - "user_input": {"type": "text"}, - "tags": { - "type": "object", - "properties": { - "tags": {"type": "keyword"}, - "full_content": {"type": "text"} + if target_index == 'student_info': + mapping = { + "mappings": { + "properties": { + "user_id": {"type": "keyword"}, + "grade": {"type": "keyword"}, + "recent_questions": {"type": "text"}, + "learned_knowledge": {"type": "text"}, + "updated_at": {"type": "date"} + } + } + } + else: + mapping = { + "mappings": { + "properties": { + "embedding": { + "type": "dense_vector", + "dims": Config.EMBED_DIM, + "index": True, + "similarity": "l2_norm" + }, + "user_input": {"type": "text"}, + "tags": { + "type": "object", + "properties": { + "tags": {"type": "keyword"}, + "full_content": {"type": "text"} + } } } } } - } # 检查索引是否存在,存在则删除 - if conn.indices.exists(index=self.index_name): - conn.indices.delete(index=self.index_name) - logger.info(f"删除已存在的索引 '{self.index_name}'") - print(f"删除已存在的索引 '{self.index_name}'") + if conn.indices.exists(index=target_index): + conn.indices.delete(index=target_index) + logger.info(f"删除已存在的索引 '{target_index}'") + print(f"删除已存在的索引 '{target_index}'") # 创建索引和mapping - conn.indices.create(index=self.index_name, body=mapping) - logger.info(f"索引 '{self.index_name}' 创建成功,mapping结构已设置") - print(f"索引 '{self.index_name}' 创建成功,mapping结构已设置。") + conn.indices.create(index=target_index, body=mapping) + logger.info(f"索引 '{target_index}' 创建成功,mapping结构已设置") + print(f"索引 '{target_index}' 创建成功,mapping结构已设置。") return True except Exception as e: - logger.error(f"重建mapping失败: {str(e)}") - print(f"重建mapping失败: {e}") + logger.error(f"重建索引 '{target_index}' 失败: {str(e)}") + print(f"重建索引 '{target_index}' 失败: {e}") + + # 提供认证错误的具体提示 + if 'AuthenticationException' in str(e): + print("认证失败提示: 请检查Config.py中的ES_CONFIG配置,确保用户名和密码正确。") + logger.error("认证失败: 请检查Config.py中的ES_CONFIG配置,确保用户名和密码正确。") + return False finally: # 释放连接回连接池 diff --git a/dsSchoolBuddy/ElasticSearch/Utils/__pycache__/EsSearchUtil.cpython-310.pyc b/dsSchoolBuddy/ElasticSearch/Utils/__pycache__/EsSearchUtil.cpython-310.pyc index baa3d6795d21468c4adf7c1e9841ea383bf3936c..e09d9fc754fdc8343d4c89047cbf3fbb57895eb2 100644 GIT binary patch delta 3935 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 A6#xJL