main
HuangHai 4 weeks ago
parent 0d1ae51bf0
commit e2a8913778

@ -1,110 +0,0 @@
import logging
from typing import Optional, List, Dict
from aiomysql import DictCursor
class KbDao:
def __init__(self, mysql_pool):
self.mysql_pool = mysql_pool
self.logger = logging.getLogger(__name__)
async def create_kb(self, kb: Dict) -> int:
async with self.mysql_pool.acquire() as conn:
async with conn.cursor(DictCursor) as cur:
await cur.execute(
"INSERT INTO t_ai_kb(kb_name, short_name) VALUES(%s, %s)",
(kb['name'], kb.get('description', '')))
await conn.commit()
return cur.lastrowid
async def get_kb(self, kb_id: int) -> Optional[Dict]:
"""获取知识库详情"""
async with self.mysql_pool.acquire() as conn:
async with conn.cursor(DictCursor) as cur:
await cur.execute(
"SELECT * FROM t_ai_kb WHERE id = %s", (kb_id,))
return await cur.fetchone()
async def update_kb(self, kb_id: int, kb: Dict) -> bool:
"""更新知识库信息"""
async with self.mysql_pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(
"UPDATE t_ai_kb SET name = %s, description = %s WHERE id = %s",
(kb['name'], kb['description'], kb_id))
await conn.commit()
return cur.rowcount > 0
async def delete_kb(self, kb_id: int) -> bool:
"""删除知识库"""
async with self.mysql_pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(
"DELETE FROM t_ai_kb WHERE id = %s", (kb_id,))
await conn.commit()
return cur.rowcount > 0
async def create_kb_file(self, file: Dict) -> int:
"""创建知识库文件记录"""
async with self.mysql_pool.acquire() as conn:
async with conn.cursor(DictCursor) as cur:
await cur.execute(
"""INSERT INTO t_ai_kb_files
(kb_id, file_name, file_path, file_size, file_type, state)
VALUES(%s, %s, %s, %s, %s, %s)""",
(file['kb_id'], file['file_name'], file['file_path'],
file['file_size'], file['file_type'], file['state']))
await conn.commit()
return cur.lastrowid
async def get_kb_file(self, file_id: int) -> Optional[Dict]:
"""获取文件详情"""
async with self.mysql_pool.acquire() as conn:
async with conn.cursor(DictCursor) as cur:
await cur.execute(
"SELECT * FROM t_ai_kb_files WHERE id = %s", (file_id,))
return await cur.fetchone()
async def update_kb_file(self, file_id: int, file: Dict) -> bool:
"""更新文件信息"""
async with self.mysql_pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(
"""UPDATE t_ai_kb_files SET
kb_id = %s, file_name = %s, file_path = %s,
file_size = %s, file_type = %s, state = %s
WHERE id = %s""",
(file['kb_id'], file['file_name'], file['file_path'],
file['file_size'], file['file_type'], file['state'], file_id))
await conn.commit()
return cur.rowcount > 0
async def delete_kb_file(self, file_id: int) -> bool:
"""删除文件记录"""
async with self.mysql_pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(
"DELETE FROM t_ai_kb_files WHERE id = %s", (file_id,))
await conn.commit()
return cur.rowcount > 0
async def handle_upload(self, kb_id: int, file) -> Dict:
"""处理文件上传"""
# 文件保存逻辑
# 数据库记录创建
# 返回文件信息
pass
async def get_unprocessed_files(self) -> List[Dict]:
"""获取未处理文件列表"""
async with self.mysql_pool.acquire() as conn:
async with conn.cursor(DictCursor) as cur:
await cur.execute(
"SELECT * FROM t_ai_kb_files WHERE state = 0")
return await cur.fetchall()
async def list_kbs(self) -> List[Dict]:
"""获取所有知识库列表"""
async with self.mysql_pool.acquire() as conn:
async with conn.cursor(DictCursor) as cur:
await cur.execute("SELECT * FROM t_ai_kb")
return await cur.fetchall()

@ -1,132 +0,0 @@
### 一、安装 $ES$
**1、下载安装包**
进入官网下载$linux$安装包 [下载地址](https://www.elastic.co/cn/downloads/elasticsearch)
![img](https://i-blog.csdnimg.cn/direct/04ae4c7f65fe475fb19e913eaf80ba04.png)
**2、安装$JDK$$21$**
```sh
sudo yum install java-21-openjdk-devel
echo 'export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
```
**3、上传文件到$linux$服务器**
```sh
# 如果没有 rz 命令 先安装
yum -y install lrzsz
# rz 打开弹窗 选择下载好的文件 确认 在哪个目录下执行,就会上传到该目录下
rz -be
```
**4、新建用户并设置密码**
```sh
# 创建用户
useradd elauser
# 设置密码 符合密码规范 大写 + 小写 + 数字 + 特殊字符 + 大于八位
passwd elauser
#输入密码:
DsideaL@123
tar -zxvf elasticsearch-9.0.2-linux-x86_64.tar.gz
sudo chown -R elauser:elauser /usr/local/elasticsearch-9.0.2
# 进入解压文件并编辑配置文件
cd elasticsearch-9.0.2/config
vi elasticsearch.yml
# 修改数据目录和日志目录
mkdir -p /usr/local/elasticsearch-9.0.2/data
mkdir -p /usr/local/elasticsearch-9.0.2/logs
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623130022571.png)
设置允许所有IP进行访问在添加下面参数让$elasticsearch-head$插件可以访问$es$
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623130217136.png)
```yaml
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
```
**5、修改系统配置**
```sh
# m.max_map_count 值太低
# 临时解决方案需要root权限
sudo sysctl -w vm.max_map_count=262144
# 永久解决方案需要root权限
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 验证是否有效
sysctl vm.max_map_count
```
**6、启动**
```sh
# 启动
su - elauser
cd /usr/local/elasticsearch-9.0.2/bin
# ./elasticsearch-keystore create
# 启动 -d = damon 守护进程
./elasticsearch -d
# 访问地址
https://10.10.14.206:9200
# 日志文件
/usr/local/elasticsearch-9.0.2/logs/elasticsearch.log
```
弹出输入账号密码,这里需要重置下密码,再登录 进入安装目录的bin目录下
执行下面命令 就会在控制台打印出新密码 账号就是 elastic
```
./elasticsearch-reset-password -u elastic
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623132315148.png)
登录成功,完活。
```sh
elastic
jv9h8uwRrRxmDi1dq6u8
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623132417828.png)
> **注意**:如果访问不到,请检查是否开启了$VPN$
### 二、安装$ik$中文分词插件
```bash
# 安装分词插件
./bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/9.0.2
# 检查插件列表
[elauser@maxkb elasticsearch-9.0.2]$ ./bin/elasticsearch-plugin list
analysis-ik
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623133924355.png)

@ -1,55 +0,0 @@
from pydantic import BaseModel
from typing import Optional
from datetime import datetime
class KbBase(BaseModel):
name: str
description: Optional[str] = None
class KbCreate(KbBase):
pass
class KbUpdate(KbBase):
pass
class Kb(KbBase):
id: int
create_time: datetime
update_time: datetime
class Config:
orm_mode = True
class KbFileBase(BaseModel):
kb_id: int
file_name: str
file_path: str
file_size: int
file_type: str
state: int = 0
class KbFileCreate(KbFileBase):
pass
class KbFileUpdate(KbFileBase):
pass
class KbFile(KbFileBase):
id: int
create_time: datetime
update_time: datetime
class Config:
orm_mode = True
class KbModel(BaseModel):
kb_name: str
short_name: str
is_delete: Optional[int] = 0
class KbFileModel(BaseModel):
file_name: str
ext_name: str
kb_id: int
is_delete: Optional[int] = 0
state: Optional[int] = 0

@ -1,61 +0,0 @@
/*
Navicat Premium Dump SQL
Source Server : 10.10.14.210
Source Server Type : MySQL
Source Server Version : 50742 (5.7.42-log)
Source Host : 10.10.14.210:22066
Source Schema : base_db
Target Server Type : MySQL
Target Server Version : 50742 (5.7.42-log)
File Encoding : 65001
Date: 24/06/2025 18:45:23
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_ai_kb
-- ----------------------------
DROP TABLE IF EXISTS `t_ai_kb`;
CREATE TABLE `t_ai_kb` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`kb_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '知识库名称',
`short_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '英文简称',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`is_delete` int(11) NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `short_name`(`short_name`) USING BTREE,
INDEX `is_delete`(`is_delete`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'AI知识库' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_ai_kb
-- ----------------------------
-- ----------------------------
-- Table structure for t_ai_kb_files
-- ----------------------------
DROP TABLE IF EXISTS `t_ai_kb_files`;
CREATE TABLE `t_ai_kb_files` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名称',
`ext_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件扩展名',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`kb_id` int(11) NOT NULL COMMENT '隶属知识库ID',
`is_delete` int(11) NOT NULL DEFAULT 0 COMMENT '是否删除',
`state` int(11) NOT NULL DEFAULT 0 COMMENT '0:上传后未处理1上传后已处理,2:处理失败',
PRIMARY KEY (`id`) USING BTREE,
INDEX `kb_id`(`kb_id`) USING BTREE,
INDEX `is_delete`(`is_delete`, `state`) USING BTREE,
CONSTRAINT `t_ai_kb_files_ibfk_1` FOREIGN KEY (`kb_id`) REFERENCES `t_ai_kb` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'AI知识库上传的文件' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_ai_kb_files
-- ----------------------------
SET FOREIGN_KEY_CHECKS = 1;
Loading…
Cancel
Save