论搜索引擎solr与MongoDB的整合

环境:

Ubuntu 12.04  Solr 5.1.0  MongoDB db version:v2.0.4

1. Solr配置与MongoDB的安装

Solr安装配置到目前已经非常简单,参考官方文档:http://lucene.apache.org/solr/quickstart.html,官方文档中用的是cloud这个样例(-e 指定),最后,我采用的是techproducts,基本命令如下:

/:$ ls solr*
solr-5.1.0.zip
/:$ unzip -q solr-5.1.0.zip
/:$ cd solr-5.1.0/
bin/solr start -e techproducts -noprompt

按照官方文档所说,如果你想用完后关闭solr并清除这个样例底下的数据,那么请运行

bin/solr stop -all ; rm -Rf example/techproducts/

之所以把这几条命令提出来,那是因为在整个过程中你可能不停的要启动,关闭,清除,一直到ok。

此处十分想吐槽网上那些业余的配置文档,凡是步骤一大片的文档最好不要看,否则整到头,到最后难过的还是你。

MongoDB的安装在Ubuntu下显得异常傻瓜,apt-get即是最好。

2. Solr与MongoDB的整合

从Solr官方给的quickstart文档上来看,它可以搜索xml, json, csv等多种文档,但丝毫看不出这东西还能跟MongoDB整合,但是万能的人类总是能想办法把他们弄到一起,或许真的有全能神吧。

还好,leader说:可以的,随手扔给了我一个链接 http://www.cnblogs.com/sysuys/p/3403670.html。但是当我看到里面的Solr版本是4.5时,我的内心是崩溃的,但是没有办法了,似乎也找不到更好的办法了。

于是,我发挥一不怕死,二不怕苦的精神,我硬着头皮往下读,突然,一片绿洲出现在我的眼前,尼玛这个文档里面有个github地址,而且正是用的github这个东西啊。

对,就是这个mongo-connector https://github.com/10gen-labs/mongo-connector/wiki/Getting-Started,瞧,我们又找到了一个官方文档了,嗯,靠谱。但最后的结果让我决定我还是得整理出来一个适合自身国情发展需要的配置文档来。

算了,废话太多,直接步骤吧:

1). 建立MongoDB的replica set(副本集,大概是这么翻译的).

在使用apt-get安装完MongoDB之后,系统会自行启动MongoDB的服务器,我们将其杀死:

pkill mongod

然后指定副本集启动:

mongod --replSet myDevReplSet

MongoDB的终止和启动似乎就是这么简单,你要是像上面这样启动,它就在前台运行,你需要再次结束时,直接Ctrl+C,如果启动时加上&,它就在后台运行,当然也就得用pkill或者kill了。

然后在mongo shell下对副本集进行初始化:

weizheng@weizheng-HP-Pro-2080-Microtower-PC:~/solr-5.1.0$ mongo
MongoDB shell version: 2.0.4
connecting to: test
PRIMARY> rs.initiate()
这个时候MongoDB这一边就弄好了,很简单,就是要加一个副本集。

2). 安装mongo-connector

安装参考https://github.com/10gen-labs/mongo-connector,十分简单,一条命令:

pip install mongo-connector

如果提示没有python-pip,apt-get一下便好。mongo-connector这个中间件好了,但是先别急着用,因为这个东西要读取Solr的配置文件,所以Solr中的一些地方弄好了,再用这个就又只是一条命令罢了。

3). Solr一端的配置

这个要是参考mongo-connector及其他文章可就坑大了。

a>

首先它们会让你修改Solr的schema.xml这个文件,但是在熟悉Solr的真个过程中,连这个文件的毛都没见到,去哪修改啊。

没有办法,这个时候找也得找,不找也得找,使用强大的find命令吧:

weizheng@weizheng-HP-Pro-2080-Microtower-PC:~/solr-5.1.0$ find . -name "schema.xml"
./server/solr/configsets/basic_configs/conf/schema.xml
./server/solr/configsets/sample_techproducts_configs/conf/schema.xml
./example/example-DIH/solr/tika/conf/schema.xml
./example/example-DIH/solr/mail/conf/schema.xml
./example/example-DIH/solr/solr/conf/schema.xml
./example/example-DIH/solr/rss/conf/schema.xml
./example/example-DIH/solr/db/conf/schema.xml
./example/techproducts/solr/techproducts/conf/schema.xml

好的,对应我们前面的techproducts样例,看起来结果中有两条相关,有这个关键字嘛,那大概就是这两个了,当然,这时候根据经验来说应该选择修改第一个的,因为前面有提到能清除用户的样例,也就是说第二个相关的schemal.xml是可以删除的,立即产生不好的预感,这个东西肯定是Solr开启时自动生成的,而怎么生成呢,绝大可能是上述第一个的位置schema.xml的副本,后面验证了,果然没错。

进入正题,找到修改的地方了,那么,修改吧:

打开

vi ./server/solr/configsets/sample_techproducts_configs/conf/schema.xml

<uniqueKey>id</uniqueKey>

替换成

<uniqueKey>_id</uniqueKey>

再添加

<field name="_id" type="string" indexed="true" stored="true" />
<field name="_ts" type="long" indexed="true" stored="true" />
<field name="ns" type="string" indexed="true" stored="true"/>

最好是这几处放在一块,做个标记,以后方便查询嘛,另外,此处存坑:

注释掉原来的

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

不然往Solr中添加一个json,或者xml都会要求有这个字段id,因为required="true"嘛,这些东西都是我遇到问题后发现的。

schema.xml的修改就是这些。

b>

此处又存在另外一个坑,其实我们还需要修改solrconfig.xml,要说这些东西都怎么发现的,被坑了之后碰出来的都。

打开:

vi ./server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml

<requestHandler name="/admin/luke"       class="solr.admin.LukeRequestHandler" />

解注释,这个东西要被mongo-connector用到,mongo-connector会请求获取上面的schema.xml,正是这个Handler来处理这个请求,所以说这个很重要。而似乎官方文档认为我们这个就是默认开启的,并没有提到此事,所以说巨坑!

c>

配置文件就是上面两个,就是这块比较复杂,不敢保证其他版本的Solr也是这样。

最后,我们按照之前说的关闭Solr,清除example/techproducts目录,重新再次启动Solr,重启techproducts样例会产生一些错误,那是因为修改了schema.xml,里面uniqueKey变成了_id,而不是id,所以会产生这些错误,但这些都可以忽略,不产生错误就说明有问题。之后你会发现,那两个配置文件被复制成了exmaple/techproducts这个样例的配置文件,就像上文说的。


OK,Solr一端的配置完毕。

4). 使用mongo-connector连接Solr与MongoDB

如果你再一次参考github上的官方文档,恭喜,你又跳了一次坑,在目前的情况下,请运行:

mongo-connector --auto-commit-interval=1 -d solr_doc_manager -t http://localhost:8983/solr/techproducts

注意,与官方不同的正是这个-t后面的链接,因为我们用的是techproducts样例,所以后面也应该加上这个名字,其实一开是完全不知到这个链接是干啥的,完全是各种误打误撞,鼠标点点出来的,这个--auto-commit-interval参数设为0,从实验结果来看,应该是一直都不会把MongoDB中的数据写传到Solr那边的意思,似乎与官方文档完全相反,有待继续验证。


最终效果就是你在MongoDB中添加一条数据,1s之后在Solr中用*:*查询,就会显示出更新。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。