[关闭]
@gaoxiaoyunwei2017 2017-10-26T10:01:35.000000Z 字数 2741 阅读 327

基于分布式数据库的全文搜索系统

刘策


文档修订日志:

版本 修订时间 修订内容 修订人
1 2017-01-20 初版 江和慧

目录

前言

开源的全文搜索项目中,lucene应该是最流行的,实际项目中必须是多个lucene共同提供服务,所以在lucene之上,分布式的全文搜索项目(如solr, elastic search)大展拳脚;但他们有个缺点,将文档和文档生成的单词信息放在同一个lucene中,搜索的时候需要到所有的节点上去搜索才能得到完整的结果;基于此,文档和单词信息的存储策略需要调整,经过探索,基于分布式数据库的全文搜索系统应运而生,此系统核心在于存储的改进.

设计思想

分布式表设计

表的描述 字段描述 均衡字段 备注
文档表 tab_doc doc_id 文档id doc_url 文档地址 doc_download_content 下载的文档内容本身 doc_content 已经分析和存储的文档内容本身 doc_download_status 下载状态,0表示未下载,1表示正在下载,2表示下载完成, doc_downloadtime 下载完成时间 doc_parse_status 分析状态,0表示未分析存储,1表示正在分析存储,2表示分析存储完成 doc_parsetime 分析完成时间 doc_id 存储文档的信息,文档的内容可以作为文档是否新增或者更新的依据,文档时候可以重新获取到可以作为文档是否删除的依据。
单词表 tab_term term_id 单词id term_name 单词 doc_id 单词所在的文档 term_freq 单词的频率 term_id 存储单词的信息
语料库表 tab_corpus term_id 单词id term_name 单词 term_idf 单词的逆文档频率 term_id 存储语料库,term_name进行了冗余. 可以定期同步搜索引擎的语料库, 也可以使用自己本身这套系统定期生成,文档总数就是tab_doc的文档数,单词的文档数就是单词表中某个单词的记录数, 无论哪个都得定期的更新或者同步, 到底使用哪个依据使用情况来决定.

其中tab_doc的状态字段意义:
doc_download_status

doc_parse_status

架构

image1.jpg-48.3kB

文档索引过程:

包括下载和分析存储

1、多线程下载过程:

根据文档地址得到文档id,查询文档表,看是否有这个文档id的记录

2、多线程分析存储

查询文档表中的记录,查询 doc_parse_status 的值

文档搜索过程:

例子

例子假设以下信息

为了示例,选择3篇个文档和8个单词作为演示用

文档的id和主要单词的id

索引

文档表的数据如下:

经过分词,统计单词的出现次数,得到单词表的数据如下,(出现次数为0的记录实际不存在,仅为说明)

语料库,收集的文档数10亿

搜索
例如用户输入 “ 机器学习开源 “

总结

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注