最近将公司的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的数据,其实这个时候也更新了索引。
这边只是给大家一些思路,如果不封装框架,用起来会麻烦些
如果封装框架,用起来会简单些,难度就在写框架的这个过程中了
以上思路,仅供参考。。。