检索¶
架构设计¶

Pylucene 功能设计¶
核心¶
- 多线程:多线程定时从爬虫数据库读取信息并构建索引数据库
- 索引数据库分片:通过将索引数据库分片,实现搜索时候的多线程检索,提高搜索速度,达到千万数据量新闻秒级别响应
- 镜像重构:在原本的 Pylucene 镜像中增添新的中文分词器,获得更好的分词效果
- 关键词高亮:利用 Pylucene 的原生高亮功能对索引数据库中出现关键词的片段进行高亮处理,减小 Django 后端的压力,并且也能提高响应速度。
- 模块分离:遵从模块分离原则,在搜索部分引入 TinyRpc 通信模块,Django 后端与 Pylucene 通过 HTTP 协议进行数据通信
- 多样检索方式:设计了基本分词检索、必选词与排除词检索等检索接口,为用户提供多样的搜索服务。
数据库构建¶
- 定时从爬虫数据库进行数据的读取,每 1s 进行一次新闻检索,是否有新的新闻写入。
- 分片构建索引数据库,根据新闻的数据库 id 写入对应的分片索引数据库中,同时也能实现多线程写入,提高读取速度,目前的速度大约是600 w/天,远大于爬虫爬取速度,能够满足实际需求。
索引服务¶
-
分片索引数据库多线程索引,提高搜索速度,结果合并的时候根据 Pylucene 的关键词相关度打分进行排序,返回最相关的新闻。
-
搜索按照时间排序:为了在保证相关度的同时对返回新闻进行时间的排序,我们对索引数据库中的返回数据进行了一个阈值的筛选,相关度评分大于该值的新闻进行排序,并且返回排序结果。
-
关键词与排除词搜索:利用 Pylucene 的
多域检索和Term检索支持多关键词和排除词搜索需求。
实现¶
Read相关¶
对每一条写入索引数据库的新闻,记录如下条目:
- news_url: 新闻网址
- category: 新闻类别
- media: 新闻媒体
- tags: 新闻标签
- title: 新闻标题
- content: 新闻正文
- first_img_url: 头图
- pub_time: 发布时间
- id:数据库 id
关键函数:
def check_db_status:用来检查数据库的连接状态def get_document:生成索引数据类对象-
def read_from_db:用来从爬虫数据库读取信息并写入索引数据库- 传入:起始 id 与终止 id
-
def read_thread:用于多线程的读取管理
Search相关¶
核心实现类:class SearchEngine()
核心功能:提供搜索的相关接口
关键函数:
def search_keywords:- 传入:搜索的关键词、必须包含的关键词列表、排除词列表、分页页码
- 返回:相关页码高亮后的十条结果组成的列表
def search_news:- 传入:搜索的关键词、分页页码
- 返回:相关页码高亮后的十条结果组成的列表
Thread相关¶
核心实现类:class MyThread()
核心功能:用来维护多线程的搜索功能,并且记录返回结果
关键函数:
def run:多线程函数的运行管理def get_result:带返回值的多线程函数的结果记录
搜索后端¶
搜索相关¶
核心功能:支持基本的搜索功能
关键函数:
keyword_search:实现最基本的搜索功能,从前端请求中解析出相关的关键词、页码、必含词排除词参数进行搜索处理get_location:根据 Pylucene 对于搜索关键词的高亮标记进行位置定位,方便前端的渲染check_contain:由于 Pylucene 相关的分词器有时候无法满足需求,需要对返回结果进行额外的必含词与排除词检查
用户功能相关¶
核心功能:满足搜索中相关的用户需求记录
关键函数:
update_tags:根据 jieba 分词器以及搜索的返回结果,将前三条搜索结果的 tags 存入用户的搜索偏好中personalize:根据用户的搜索偏好进行用户的个性化推荐,返回相关的新闻。
搜索建议¶
通过Elasticsearch进行搜索建议的返回
核心类:class ElasticSearch
核心函数:suggest:传入已经写入的关键词,返回相信的搜索补全推荐结果。