# SearchSystem **Repository Path**: DRZHAO/SearchSystem ## Basic Information - **Project Name**: SearchSystem - **Description**: 毕设 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-04 - **Last Updated**: 2021-06-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于知识图谱的智能搜索系统 基于 MERN 技术栈的搜索子系统。本项目的前端界面设计仿照深圳市公安局搜索页面
测试环境知识图谱采用了[思知平台](https://console.ownthink.com/)进行模拟
生产环境应该使用广州市机器人租户平台 ## 依赖 Node MongoDB Redis ## 快速体验 只需要 clone 此仓库,安装依赖并运行: ``` git clone https://gitee.com/DRZHAO/SearchSystem.git cd SearchSystem npm install npm run start ``` 搜索系统会运行于开发模式。使用浏览器访问 `127.0.0.1` 即可体验搜索子系统。 ## 设计思路 1. 智能推荐关键词算法: 1. (测试环境下)先从足够多的excel上提取每个单元格对应的材料和内容,然后封装成数据库对象存入mongo里面,参考后面的数据库模型。
(生产模式下)应从管理员内网创建事项内容,然后直接入库 2. (测试环境)使用python的jieba库进行分词,然后存入专属的一张分词表中,具体结构参考后面的数据库模型 3. 在MERN框架中的Express中存入一个名为trie的对象,该对象会在Express启动的时候进行加载,trie对象会加载在数据库中的分词表,然后对分词表中的所有词进行前缀树的构建,(前缀树的数据结构可参考Trie.js) 4. 前端使用autocomplete组件,当输入字符串后,每1s会激活一次节流函数rebounce(),然后axios会发送http请求,将用户输入的关键词到Express后端 5. 后端拿到关键词以后,会从app.get()中得到trie对象,并使用该对象带的函数进行查找,如果匹配到某个关键词的前缀, 就会将关键词放入一个数组当中,然后再从Redis上面获取每个匹配到的关键词的搜索次数,然后进行topK(默认大小为5)排序,最后返回结果,并更新Redis上的搜索次数 2. 智能排序算法 1. 前端首先会通过SearchFilter里面的3个数组产生一个请求的url,然后向后端发送http请求 2. 后端拿到前端传来的filter数据以后,就会对keyword使用nodejieba分词(使用BM25算法),然后对query以及倒排索引进行一个评分,最后根据评分大小进行排序,分页返回 3. BM25公式如下 :(忽略公式的第一个因子,因为query中的词频一般都是1,因为query会比较短) 1. $BM25_{score}(Q,d)=\sum_{t\in Q}w(t,d)$ 2. $w(t,d)=\frac{qtf}{k_3+qtf}\times \frac{k_1\times tf}{tf+k_1(1-b+b\times l_d/avg\_l)}\times log_2\frac{N-df+0.5}{df+0.5}$ 3. qtf为查询中的词频、tf为文档中的次品、ld为文档长度、avg_l为平均文档长度、N为文档数量、df为文档频率、b,k1,k3为可调参数 4. 计算完BM25以后 采取了和点击量的一个综合排序,公式如下 1. $hot_{score}=k_1log(BM25_{score})+\frac{3(log(cl_{num}))}{4}$ 3. 按时间排序算法 1. 前端首先会通过SearchFilter里面的3个数组产生一个请求的url,然后向后端发送http请求 2. 后端拿到前端传来的filter数据以后,就会对keyword使用nodejieba分词(使用模糊搜索),然后会通过getSearchPattern.js进行条件的合成 3. 合成完以后会对mongodb进行条件查询,最后再返回即可 ## 数据库模型 倒排索引模型 ```js const indexesSchema = new Schema({ key: { type: String , required: true }, frequency:{type:[{doc_id: { type: Schema.Types.ObjectId, required: true}, freq:{type: Number,required: true}}],required: true} }) ``` 搜索文档模型 ```js const searchSchema = new Schema({ title: { type: 'String', required: true }, material: { type: [String], required: true }, qualifications: { type: [String], required: true }, date: { type: String, required: true }, clickNum: { type: Number, required: true }, }) ``` 前缀树分词模型 ```js const TrieData = new Schema({ name : { type: 'String', required: true}, keys: { type: [String],required: true} }) ``` ## 部署 然后让服务器在生产模式下运行: `npm run bs` ## 授权 使用 MIT 协议。