solr or es 结合弥补mongodb的全文检索功能

最近将公司的solr集群升级到了最新的6.5版本。

之前用了N年的是3点多的版本,那个时候solr还不支持自带的集群,集群方式都是自己实现的。

公司里用的最多的数据库就是mongodb了,大数据量存储,天生集群支持,分片更简单。

mongodb唯一不足的就是全文检索的能力,不过大部分公司都是用的搜索框架来单独提供搜索服务的。

下面介绍下mongodb怎么结合solr或者es来做搜索。

建索引方案一

solr或者es部分只存储需要搜索的索引和数据的主键ID。比如根据标题搜索,那么只建立标题索引。存储部分只存主键ID。

这样只要标题做了修改,需要更新标题索引即可。

更新可以在更新的业务接口中将更新索引的操作放入队列来进行建索引操作。(或者直接在业务方法中更新,这样耦合度太高,使用队列耦合低,但是索引更新会稍有延迟)

建索引方案二

solr或者es将存储所有数据,标题建索引,其他字段只做存储。

更新时需要更新所有字段。

建索引方案三

使用mongo-connector进行索引同步

当然在使用mongo-connector的时候一定要使用副本集的方式。

因为mongo-connector的原理就是监听mongodb的oplog来进行索引的同步更新。

单节点是没有操作oplog的。

搜索方案一

在搜索接口中调用solr进行搜索,如果我们只存了主键ID,那么拿到搜索的结果的数据ID对mongodb进行in查询,组装数据返回给调用方。

如果我们存储了所有字段,那么其实相当于把solr或者es当成数据库在用了,搜索的结果可以直接返回给调用方,不用经过mongodb,此时mongodb只作为一个元数据存储使用。

搜索方案二

这种方案正式我公司在使用的,原理是我们基于mongodb的协议开发了一个代理框架。

这么说可能大家不太理解,如果有用过数据库中间件mycat的同学肯定就有点印象了。

就是跟mycat一样,mycat是基于mysql协议来封装的。

对于用户来说就是可以把mycat当做一个mysql来用,mycat后面其实有多台mysql的节点,但是对于使用方来说就只有一个,屏蔽了分库分表的细节部分。

我们这个也是这样的原理,对于使用方来讲就是一个mongodb。

可以执行mongodb的所有操作,当然需要配置哪些字段需要做全文检索操作,需要分词等等。

一旦用到这个字段进行搜索的时候,框架会自动去solr或者es进行搜索,然后封装数据返回给调用方,对调用方来说是透明的,它不知道背后还去查了solr。

当然建索引也是如此,在数据插入,更新,删除的时候会实时同步索引,这样就不需要在业务中或者队列中来同步索引,在使用放看来我就是更新了mongodb的数据,其实这个时候也更新了索引。


这边只是给大家一些思路,如果不封装框架,用起来会麻烦些

如果封装框架,用起来会简单些,难度就在写框架的这个过程中了

以上思路,仅供参考。。。

原文发布于微信公众号 - 猿天地(cxytiandi)

原文发表时间:2017-06-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏日常分享

Oracle常用数据库系统表单以及SQL的整理

  因为最近涉及到了一些数据库的归档,备份等工作,所以一部分的重心放在了数据库上,毕竟之前对数据库的了解也只停留在了一般的建表,查询,最多最多再写一写触发器之类...

1491
来自专栏数据和云

经典故障分析 -用好UTL_FILE包其实并不是太容易

作者介绍 ? 崔华 网名 dbsnake Oracle ACE Director,ACOUG 核心专家 UTL_FILE包可以用来读写操作系统上的文本文件...

3599
来自专栏技术博文

MySQL常见错误码及说明

1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败<=================可以忽略 1008:数据库不存在,删除...

4578
来自专栏云计算教程系列

如何在Debian 8上安装和使用PostgreSQL 9.4

关系数据库是满足多种需求的数据组织的基石。它们支持从网上购物到火箭发射的各种功能。PostgreSQL是一个既古老但仍然存在的数据库。PostgreSQL遵循大...

2830
来自专栏云计算教程系列

如何在Ubuntu 18.04上使用PostgreSQL 10设置逻辑复制

在为生产设置应用程序时,准备好多个数据库副本通常很有用。保持数据库副本同步的过程称为复制。复制可以为大量同时读取操作提供高可用性水平扩展,同时减少读取延迟。它还...

3155
来自专栏python3

解决centos7 /etc/rc.local 不能执行

最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了

1392
来自专栏我是攻城师

如何为logstash+elasticsearch配置索引模板?

5515
来自专栏xingoo, 一个梦想做发明家的程序员

Head插件——学习Elasticsearch的锋刃利器!

在学习Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求,未免太过麻烦,而且也不够人性化。 此...

3046
来自专栏Java后端技术

Spring+SpringMvc+Mybatis框架集成搭建教程四(项目部署及测试)

(1).点击如下图所示的下拉按钮,弹出Edit Configurations...后点击该项。

813
来自专栏林欣哲

MySQL数据库备份和恢复

2432

扫码关注云+社区

领取腾讯云代金券