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 条评论
登录 后参与评论

相关文章

来自专栏开源优测

[快学Python3]PyMySQL库

概述 本文主要讲解如何使用pymysql库进行MySQL的管理操作。 主要讲解如何使用pymysql实现增删改查动作,并附上对应的示例。 安装pymysql p...

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

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

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

2160
来自专栏前端vue

对数据进行一些基本操作(四)

完整代码 ↓ ↓ ↓ ↓ github地址:https://github.com/jgsrty/jianshu_node 码云地址:https://gite...

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

如何在Ubuntu 18.04上安装和使用PostgreSQL

关系数据库管理系统是许多网站和应用程序的关键组件。它们提供了一种存储,组织和访问信息的结构化方法。

3106
来自专栏数据和云

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

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

3369
来自专栏技术博文

关于解决emoji表情的存储

近段时间处理,由于工作需求,需要使得用户插入的emoji表情能够正常显示及使用,所以做个总结,以备后用。 说明:本方法只在mysql环境中测试 1.首先程序在连...

32810
来自专栏技术博文

MySQL常见错误码及说明

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

4248
来自专栏逸鹏说道

SQL SERVER几种数据迁移/导出导入的实践

SQLServer提供了多种数据导出导入的工具和方法,在此,分享我实践的经验(只涉及数据库与Excel、数据库与文本文件、数据库与数据库之间的导出导入)。 (一...

6109
来自专栏禁心尽力

MySQL设置字段的默认值为当前系统时间

问题产生: 当我们在对某个字段进行设置时间默认值,该默认值必须是的当前记录的插入时间,那么就将当前系统时间作为该记录创建的时间。 应用场景: 1、在数据表中,要...

23610
来自专栏日常分享

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

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

1281

扫码关注云+社区