项目作者: QuQBaZhaHei

项目描述 :
基于django和elasticsearch的简单搜索引擎,具有摘要和高亮效果
高级语言: Python
项目地址: git://github.com/QuQBaZhaHei/search-engine.git
创建时间: 2020-02-09T15:44:18Z
项目社区:https://github.com/QuQBaZhaHei/search-engine

开源协议:

下载


search-engine

基于django和elasticsearch的简单搜索引擎,WEB端显示,具有摘要和高亮效果。
1 django框架搭建
1.1 配置数据库
pymysql库为python操作mysql库中常用的第三方库。在python中通过pymysql.content链接数据库,创建连接对象。连接对象通过调用cursor创建新的数据库对象,数据库对象通过executemany添加数据。插入完数据之后通过对象调用close方法关闭指针对象,最后关闭连接对象。
Django本身默认使用SQLite,在配置以前,先在mysql中创建好相应的数据库。然后在settings.py文件中,通过DATABASES选项进行数据库配置。

图 1 数据库配置1
接着告诉Django用pymysql代替默认的MySQLdb 连接MySQL数据库,在项目同名的包下面的 init.py文件中,加入下面句话。

图 2 数据库配置2
在app下面的models.py文件夹中定义一个类,这个类必须继承 models.Model,且类名即数据库中的表名。

图 3 数据库配置3
执行两个命令,迁移数据库:
python3 manage.py makemigrations
python3 manage.py migrate
1.2 设置路由
路由系统就是路径和视图函数的一个对应关系。django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系。使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户端http页面数据。用户访问http://127.0.0.1:8000/index 然后后端使用index()函数处理。

图 4 路由图解
先从创建的app下的views.py面定义处理数据的函数。

图 5 路由配置1
在urls.py里导入views,在urlpatterns里写入一条url与处理函数映射关系,下图相当于,url请求为:”http://127.0.0.1/8000/search/"。

图 6 路由配置2
1.3 编写html函数
Action=/search/指定输入后跳转进入指定的结果界面,name=’q’传输键入的关键词可传入类SearchView(object)的制定属性qurry。

图 7 html代码
2 索引模块
正排索引:
正排索引也称为”前向索引”。它是创建倒排索引的基础,具有以下字段:
(1)LocalId字段(表中简称”Lid”):表示一个文档的局部编号。
(2)WordId字段:表示文档分词后的编号,也可称为”索引词编号”。
(3)NHits字段:表示某个索引词在文档中出现的次数。
(4)HitList变长字段:表示某个索引词在文档中出现的位置,即相对于正文的偏移量。
在正排索引中LocalId采用升序序列编号(假定编号采用自增1的方式递增),这为下面的计算创造条件。进行倒排索引的转化时,由于正排索引中Lid天然的有序性,因此在正排索引转化为倒排索引的创建过程中,自然可以保证倒排索引中每个词汇对应的文档编号也是有序的。
倒排索引:
(1)第1个部分:由不同索引词(index term)组成的索引表,称为”词典”(lexicon)。其中保存了各种中文词汇,以及这些词汇的一些统计信息(例如出现频率nDocs),这些统计信息用于各种排名算法(Ranking Algorithm)[Salton 1989;Witten 1994]
(2)第2个部分:由每个索引词出现过的文档集合,以及命中位置等信息构成,也称为”记录表”(posting file)或”记录列表”(posting list)。左边的表结构(词典)记录索引词Id号、匹配该索引词的文档数量,并匹配文档在记录文件内的偏移量,通过这个偏移量就可以读取记录文件对应区域的信息。通过读取T1的偏移量x,读取在记录文件中T1命中的相关文档Doc1、Doc2和Doc3的相关信息。

图 8 索引模块基本流程
建立索引时,分词操作是调用jieba库的cut方法或者cut_for_search方法,实现分词。分词之前去掉对网页没有作用的标点符号,例如:逗号,句号,感叹号,省略号,换行符。Cut方法会把“重庆理工大学”分为“重庆”和“理工大学”。而cut_for_search方法能够把“重庆理工大学”分为“重庆”,“理工大学”,及“重庆理工大学”。在搜索引擎中,搜索重庆理工大学的时候,希望能检索出与重庆理工大学强相关联的网页。而不是出现,和重庆相关,或者理工大学相关。所以这里选择的分词为cut_for_search方法。因此在查询系统中,也给标题相和文章的首段较重的权重。
该模块主要循环遍历sAll列表,将单词和循环得到的单词编号写入word数据库表。循环遍历tfidf列表,循环得到的tfidf值的index编号记为hid,URL列表中hid位置的url记为写入数据库表的href,title列表中hid位置的title记为写入数据库表的title,content列表中hid位置的content记为写入数据库表的content。一起写入page数据库表中。先写入word和page表,是为了写入page_word表时,需要word表中的wid和page表中的hid为外键参照。最终将wid,hid,和hid对应网页中wid对应单词的tfidf,写入page_word数据表中。
3 计算模块
计算模块主要负责计算出tdidf值,该模块主要涉及将传入的每一段正文内容进行分词,统计每个文本中每个词出现的次数,计算tf,统计每个词在哪些文档中出现过,计算idf的值,计算tf-idf,求每个文档单词的合集,最终返回计算结果,准备进行链接处理。
4 连接模块
连接模块主要负责连接mysql数据库,插入mysql数据库,关闭mysql数据库。该模块为:
在主函数调用connect_mysql连接数据库时创建连接对象,用连接对象创建新的数据库对象。
调用插入方法时,不同的表,调用不同的插入方法。因为需插入的表不一致,参数也不一致。所以传入需要有每条插入信息的参数。
调用close_mysql方法,关闭数据库指针对象,关闭连接对象。
用try,except把这三个方法保护起来,避免插入大量内容时中途被打断。

图 9 链接模块代码
5 查询模块
查询系统将前端web网页和后台数据库相结合,将先查询语句分词,去停用词,多余的符号以及一系列消除噪音的操作以后,按照相关度或者热点的结果基于一定权重进行排序的结果,在前端网页上显示。
排序思想:
利用关键词在文档中出现的频率和位置排序是搜索引擎最早期排序的主要思想,其技术发展也最为成熟,是第一阶段搜索引擎的主要排序技术,应用非常广泛,至今仍是许多搜索引擎的核心排序技术。其基本原理是:关键词在文档中词频越高,出现的位置越重要,则被认为和检索词的相关性越好。
(1)词频统计
文档的词频是指查询关键词在文档中出现的频率。查询关键词词频在文档中出现的频率越高,其相关度越大。但当关键词为常用词时,使其对相关性判断的意义非常小。TF/IDF很好的解决了这个问题。
(2)词位置加权
在搜索引擎中,主要针对网页进行词位置加权。所以,页面版式信息的分析至关重要。通过对检索关键词在Web页面中不同位置和版式,给予不同的权值,从而根据权值来确定所搜索结果与检索关键词相关程度。可以考虑的版式信息有:是否是标题,是否为关键词,是否是正文,字体大小,是否加粗等等。同时,锚文本的信息也是非常重要的,它一般能精确的描述所指向的页面的内容。
在本实验中,我将标题和首段赋予较大权重的效果比较好,故采用赋予标题和首段较大权重作为最后方法。因为搜索引擎所用网页皆为科普中国分栏目的文章,不存在链接上的权重高低,所以不考虑链接分析。

图 10 查询模块顺序
6 文章摘要和关键词标红
基于TextRank的自动文摘属于自动摘录,通过选取文本中重要度较高的句子形成文摘,其主要步骤如下:
预处理:将输入的文本或文本集的内容分割成句子得,构建图G =(V,E),其中V为句子集,对句子进行分词、去除停止词,得,其中是保留后的候选关键词。
句子相似度计算:构建图G中的边集E,基于句子间的内容覆盖率,给定两个句子,采用如下公式进行计算:
若两个句子之间的相似度大于给定的阈值,就认为这两个句子语义相关并将它们连接起来,即边的权值:
句子权重计算:根据公式,迭代传播权重计算各句子的得分;
抽取文摘句:将3得到的句子得分进行倒序排序,抽取重要度最高的T个句子作为候选文摘句。
形成文摘:根据字数或句子数要求,从候选文摘句中抽取句子组成文摘。
为了避免造成文字截断,我采用相应位置添加省略号来改善文章摘要句意的美感。

图 11 文章摘要文字处理
haystack为我们提供了 {% highlight %}和 {% more_like_this %} 2个标签, {% highlight %} 为我们提供了这个功能。高亮处理的原理其实就是给文本中的关键字包上一个 span 标签并且为其添加 highlighted 样式。
{% highlight with [css_class “class_name”] [html_tag “span”] [max_length 200] %}
大概意思是为 text_block 里的 query 部分添加css_class,html_tag,而max_length 为最终返回长度,相当于 cut ,我看了一下此标签实现源码,默认的html_tag 值为 span ,css_class 值为 highlighted,max_length 值为 200。
7 统计检索结果
为了显示检索结果条数,我在paginator的函数下的Page类中添加属性len,并编写函数进行计算。

图 12 添加统计检索结果属性
8 配置到本地服务器
安装IIS到本地,pip install安装wfastcgi,安装成功之后,通过下面命令启动它:
wfastcgi-enable
启动成功之后,它会把Python路径和wfastcgi的路径显示出来,我们需要把这个路径复制出来,修改到web.config里面,同时在根目录和static下添加web.config文件。

图 13 添加web.config文件

图 14 添加网站
用下面的命令把当前项目环境的软件包信息和依赖软件导出到requirements.txt文件里,pip freeze > requirements.txt
之后打开CMD切换到项目文件夹路径,输入下面命令,安装项目所需要依赖和软件包:
pip install -r requirements.txt
修改完毕,启动IIS,在浏览器里输入http://127.0.0.1 就能访问网站。