# 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 协议。