使用数据库使用全文索引



数据库的模糊搜索 和 搜索引擎的功能 不是一个概念。数据库的模糊搜索是不能走索引的,也不好实现搜索词的逻辑(与或非)和范围搜索(在特定的域中)。 能走的只有前缀索引,但是这大大限制了功能。

不过使用数据库来实现搜索引擎也是一个思路,我有一个基于分布式数据库的全文索引的方案(代号x)

相比solr或elasticsearch的区别如下:

1 solr或elasticsearch是以文档进行均衡分片的,x是以单词(term)进行均衡分片的。

2 solr或elasticsearch要到所有的shard上去搜索,最后在replica上合并结果;
x只需要到单词(term)所在的节点上进行搜索(只有一个节点),而且数据库有索引,速度非常快。

正是由于这个区别,搜索的速度得以提升,特别是在大数据量(机器多,分片多)的情况下,
x方案有它独有的好处(精确定位term所在的节点),
代价就是在索引阶段需要把单词和文档都定位到某个具体的节点上。

数据库的表结构设计,由于是分布式数据库,所以表示根据某个字段分布到不同的数据库节点上的:

单词表 tab_term ,均衡字段是 term_id,字段意义:
term_name 单词
field_name 单词的域
doc_id 单词所在的文档
term_freq 单词的频率
term_tfidf 单词的逆文档频率
score 单词的得分,可以使用逆文档频率代替

文档表 tab_doc , 均衡字段是doc_id, 字段意义:
doc_id 文档id 
doc_type 文档类型
doc_content 文档内容本身 

索引过程:

1 一个文档,经过分析(分词),得到每个单词的域 ,词频,词频-逆文档频率等信息
按照 term_name 作为均衡字段,将数据分割到tab_term的各个节点上
2 然后将文档进行hash,得到文档id,文档类型等,根据doc_id 将数据分散到tab_doc的各个节点上

搜索过程:

用户输入的关键词进行分析(分词) ,根据分词到 tab_term 中检索,得到每个 term 的 doc_id 列表;
然后对doc_id 进行排名,再去 tab_doc 返回原始文档
发布了18 篇原创文章 · 获赞 10 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_34146899/article/details/53216742
今日推荐