天天看点

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

solr配置与mongodb的安装

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

注意:如果unzip没有安装,请先安装:apt-get install unzip

root@xxx:xxx# ls solr-*

solr-5.3.1.zip  solr-5.3.1.zip

root@xxx:xxx# unzip -q solr-5.3.1.zip

root@xxx:xxx# cd solr-5.3.1/

root@xxx:/home/software/solr-5.3.1# bin/solr start -e techproducts –noprompt

your current version of java is too old to run this version of solr

we found version 1.7.0_79, using command '/usr/java/jdk1.7.0_79/bin/java'

please install latest version of java 8 or set java_home properly.

debug information:

java_home: /usr/java/jdk1.7.0_79

active path:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/java/jdk1.7.0_79/bin:/usr/local/mongodb/bin

如果出现上面的提示语,请安装jdk1.7以上版本

安装好之后执行:

root@xxx:/home/software/solr-5.3.1# bin/solr start -e techproducts -noprompt

这时候从浏览器访问:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

上面的techproducts就是一个solrcore

1、solr的安装和启动停止

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

root@xxx:/home/software/solr-5.3.1# pwd

/home/software/solr-5.3.1

root@xxx:/home/software/solr-5.3.1# bin/solr stop -all

sending stop command to solr running on port 8983 ... waiting 5 seconds to allow jetty process 1816 to stop gracefully.

root@xxx:/home/software/solr-5.3.1# rm -rf example/techproducts/

注意:如果在停止所有之后执行:bin/solr start -all -noprompt   默认到,然后访问:http://localhost:8983/solr/   ,添加solrcore,它最后会到/home/software/solr-5.3.1/server/solr中去找。若没有,拷贝:/home/software/solr-5.3.1/example/techproducts/techproducts    到   /home/software/solr-5.3.1/server/solr   并将名称techproducts改成docdetection,例如:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

并修改docdetection中的core.properties的内容为:

#written by corepropertieslocator

#fri mar 31 18:36:50 utc 2017

name=docdetection

config=solrconfig.xml

schema=schema.xml

datadir=data

如果想创建多个,可以在docdetection同级目录下创建多个。比如:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

core.properties的内容如下:

name=test

进入/home/software/solr-5.3.1/server/solr-webapp/webapp/web-inf,修改web.xml中的

<env-entry>

       <env-entry-name>solr/home</env-entry-name>

       <env-entry-value>/home/software/solr-5.3.1/server/solr</env-entry-value>

       <env-entry-type>java.lang.string</env-entry-type>

    </env-entry>

接着刷新:http://localhost:8983/solr,最终的界面如下:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

2、solr与mongodb的整合

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

    参考地址:http://www.cnblogs.com/sysuys/p/3403670.html

    为了让solr和mongodb进行整合,需要mongo-connector,参考地址是:https://github.com/10gen-labs/mongo-connector/wiki/getting-started

1) 、建立mongodb的replica set(副本集)

安装python-pip 和 git

root@xxx:~# apt-get install python-pip

root@xxx:~# apt-get install git

reading package lists... done

building dependency tree      

reading state information... done

the following extra packages will be installed:

root@izm5effj2tm01xy2qqmnlzz:~#

指定副本集合启动:

mongod –replset docdetection   在本次实验中,我把他放到后台运行了,参考地址:http://blog.csdn.net/tototuzuoquan/article/details/55805811

mongodb的终止和启动很简单,你要是上面启动的,它就在前台运行,你需要再次结束时,直接ctrl + c,如果启动时加上&,它就在后台运行,当然也就得用pkill或者kill了。

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

root@xxx:/etc# mongo

mongodb shell version: 3.2.11

connecting to: test

server has startup warnings:

> rs.initiate();

{

         "info2" : "no configuration specified. using a default configuration for the set",

         "me" : "izm5effj2tm01xy2qqmnlzz:27017",

         "ok" : 1

}

docdetection:other>

这个时候mongodb这一边就弄好了,很简单,就要加一个副本集。

2)、安装mongo-connector

2.1)、mongo-connector安装(推荐)

可以在安装的时候,让mongo-connector作为一个后台进程,可以按照下面的步骤进行安装:

编辑config.json进行查看

root@xxx:/home/software/mongo-connector-master#pwd

/home/software/mongo-connector-master

root@xxx:/home/software/mongo-connector-master# pip install mongo_connector[solr]

如果查找mongo-connector在哪儿,可以使用下面的方式:

root@xxx:/etc/init.d# find / -name mongo-connector

/home/software/mongo-connector-master/scripts/mongo-connector

/usr/local/bin/mongo-connector

<a target="_blank" href="mailto:root@xxx:/etc/init.d#">root@xxx:/etc/init.d#</a>

下面是安装elastic2-doc-manager 这个doc-manager

root@xxx:/home/software/mongo-connector-master# pip install elastic2-doc-manager

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

注意:网上说通过pip安装,但是没有说卸载的,看下pip的说明:

root@xxx:/home/software/mongo-connector-master# pip  --help

usage:  

  pip &lt;command&gt; [options]

可以通过下面的方式进行卸载:

root@xxx:/home/software/mongo-connector-master# pip uninstall mongo-connector

2.2)、第二种安装mongodb-connector的方式:

cd mongo-connector

#安装前修改mongo_connector/constants.py的变量:设置default_commit_interval = 0

python setup.py install

root@xxx:/home/software# unzip mongo-connector-master.zip

root@xxx:/home/software# chmod +x setup.py

root@xxx:/home/software# cd mongo-connector-master/

root@xxx:/home/software/mongo-connector-master# python setup.py install

root@xxx:/home/software/mongo-connector-master# python setup.py install_service

running install_service

creating /var/log/mongo-connector

copying ./config.json -&gt; /etc/mongo-connector.json

copying ./scripts/mongo-connector -&gt; /etc/init.d

root@xxx:/home/software/mongo-connector-master# chmod +x /etc/init.d/mongo-connector

执行下面的命令确保系统的启动配置被更新了:

root@xxx:/home/software/mongo-connector-master# update-rc.d mongo-connector defaults

update-rc.d: warning: default start runlevel arguments (2 3 4 5) do not match mongo-connector default-start values (3 4 5)

 adding system startup for /etc/init.d/mongo-connector ...

   /etc/rc0.d/k20mongo-connector -&gt; ../init.d/mongo-connector

   /etc/rc1.d/k20mongo-connector -&gt; ../init.d/mongo-connector

   /etc/rc6.d/k20mongo-connector -&gt; ../init.d/mongo-connector

   /etc/rc2.d/s20mongo-connector -&gt; ../init.d/mongo-connector

   /etc/rc3.d/s20mongo-connector -&gt; ../init.d/mongo-connector

   /etc/rc4.d/s20mongo-connector -&gt; ../init.d/mongo-connector

   /etc/rc5.d/s20mongo-connector -&gt; ../init.d/mongo-connector

root@izm5effj2tm01xy2qqmnlzz:/home/software/mongo-connector-master#

如果想移除后台运行的可以执行下面的操作:

python setup.py uninstall_service

通过这个命令可以移除/etc/init.d/mongo-connector 和 /etc/mongo-connector.json

3)solr一端的配置:

查找schema.xml,并修改这个文件

root@xxx:/home/software/solr-5.3.1# find ./ -name "schema.xml"

./example/example-dih/solr/rss/conf/schema.xml

./example/example-dih/solr/tika/conf/schema.xml

./example/example-dih/solr/solr/conf/schema.xml

./example/example-dih/solr/mail/conf/schema.xml

./example/example-dih/solr/db/conf/schema.xml

./example/techproducts/solr/techproducts/conf/schema.xml

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

./server/solr/configsets/basic_configs/conf/schema.xml

root@izm5effj2tm01xy2qqmnlzz:/home/software/solr-5.3.1#

打开

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

将(linux上的查找方式是: esc --à    :/&lt;uniquekey&gt;)

&lt;uniquekey&gt;id&lt;/uniquekey&gt;

改成带有下划线的id:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

再添加(linux上到达最第行的命令:  esc --à  shift + g):

&lt;field name="_id" type="string" indexed="true" stored="true" /&gt;

&lt;field name="_ts" type="long" indexed="true" stored="true" /&gt;

&lt;field name="ns" type="string" indexed="true" stored="true"/&gt;

添加后的效果如下:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

注释掉原来的(命令是:  esc --à :/name="id")

&lt;!-- 

&lt;field name="id"type="string" indexed="true" stored="true"required="true" multivalued="false" /&gt;

--&gt;

截图如下:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

不然往solr中添加一个json,或者xml都要求有这个字段id,因为required=”true”

schema.xml的修改就是这些

修改solrconfig.xml

打开:

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

将(关于下面的class如果配置错了,也将出不来solr和mongodb的数据同步,参考官网:https://github.com/mongodb-labs/mongo-connector/wiki/usage%20with%20solr#make-sure-the-lukerequesthandler-is-enabled)

&lt;requesthandler name="/admin/luke" class="org.apache.solr.handler.admin.lukerequesthandler" /&gt;

解注释,如果没有,就添加一行,这个东西要被mongo-connector用到,mongo-connector会请求获取上面的schema.xml,正是这个handler来处理这个请求,所以说这个很重要。

最后:

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

root@xxx:/home/software/solr-5.3.1# cd /home/software/solr-5.3.1

root@xxx:/home/software/solr-5.3.1#

4)使用mongo-connector连接solr与mongodb.

在目前情况下,请运行(其中:mongo-connector 的参考地址是:http://blog.csdn.net/hyman_yx/article/details/51684218):

mongo-connector -m localhost:27017 --auto-commit-interval=0 -t http://localhost:8983/solr/techproducts -d solr_doc_manager &amp;

mongo-connector -m localhost:27017 --auto-commit-interval=0 -t http://localhost:8983/solr/docdetection -d solr_doc_manager &amp;

注意:

若有时候发现重新创建索引的时候不给力,需要执行下面的命令(同时要删除索引,重新创建):

root@izm5effj2tm01xy2qqmnlzz:/home/software/solr-5.3.1# rm -rf mongo-connector.log 

root@izm5effj2tm01xy2qqmnlzz:/home/software/solr-5.3.1# rm -rf oplog.timestamp 

root@izm5effj2tm01xy2qqmnlzz:/home/software/solr-5.3.1/server/solr/docdetection/data# pwd

/home/software/solr-5.3.1/server/solr/docdetection/data

root@izm5effj2tm01xy2qqmnlzz:/home/software/solr-5.3.1/server/solr/docdetection/data# rm -rf *

执行完成之后的效果如下:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

查看mongo-connector进去的内容

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

经过以上步骤配置之后,终于可以看到(至此,配置成功):

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

在mongodb中的内容为:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

如果有时候你发现你的solr没有自动同步数据,那是因为solr默认配置中,默认把自动同步给关闭了,这时候需要对solrconfig.xml自动同步的开关进行设置,可以以下操作

进入solr的目录(注意:我的solr是放在/home/software/solr-5.3.1)中的:

cd /home/software/solr-5.3.1

查找solrconfig.xml

find ./ -name solrconfig.xml,结果如下:

./example/files/conf/solrconfig.xml

./example/example-dih/solr/rss/conf/solrconfig.xml

./example/example-dih/solr/tika/conf/solrconfig.xml

./example/example-dih/solr/solr/conf/solrconfig.xml

./example/example-dih/solr/mail/conf/solrconfig.xml

./example/example-dih/solr/db/conf/solrconfig.xml

./example/techproducts/solr/techproducts/conf/solrconfig.xml

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

./server/solr/configsets/basic_configs/conf/solrconfig.xml

./server/solr/configsets/data_driven_schema_configs/conf/solrconfig.xml

修改上面红色标注出来的文件中的如下内容进行修改:

&lt;autocommit&gt;

   &lt;maxtime&gt;${solr.autocommit.maxtime:15000}&lt;/maxtime&gt;

   &lt;opensearcher&gt;false&lt;/opensearcher&gt;

&lt;/autocommit&gt;

&lt;!-- softautocommit is like autocommit except it causes a

         'soft' commit which only ensures that changes are visible

         but does not ensure that data is synced to disk.  this is

         faster and more near-realtime friendly than a hard commit.

&lt;autosoftcommit&gt;

&lt;maxtime&gt;${solr.autosoftcommit.maxtime:-1}&lt;/maxtime&gt;

&lt;/autosoftcommit&gt;

修改1:vimexample/techproducts/solr/techproducts/conf/solrconfig.xml

&lt;maxtime&gt;${solr.autocommit.maxtime:15000}&lt;/maxtime&gt;

    &lt;opensearcher&gt;false&lt;/opensearcher&gt;

       &lt;maxtime&gt;${solr.autosoftcommit.maxtime:-1}&lt;/maxtime&gt;

修改为:

&lt;maxtime&gt;300000&lt;/maxtime&gt;

    &lt;maxdocs&gt;10000&lt;/maxdocs&gt;

    &lt;opensearcher&gt;true&lt;/opensearcher&gt;

         but does not ensure that data is synced to disk.  this is

    &lt;maxdocs&gt;1000&lt;/maxdocs&gt;

    &lt;maxtime&gt;60000&lt;/maxtime&gt;

修改2:/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml

    &lt;maxtime&gt;${solr.autocommit.maxtime:15000}&lt;/maxtime&gt;

    &lt;maxtime&gt;${solr.autosoftcommit.maxtime:-1}&lt;/maxtime&gt;

    &lt;maxtime&gt;300000&lt;/maxtime&gt;

修改3:vim server/solr/configsets/basic_configs/conf/solrconfig.xml

     &lt;maxtime&gt;${solr.autocommit.maxtime:15000}&lt;/maxtime&gt;

     &lt;opensearcher&gt;false&lt;/opensearcher&gt;

     'soft' commit which only ensures that changes are visible

     but does not ensure that data is synced to disk.  this is

     faster and more near-realtime friendly than a hard commit.

     &lt;maxtime&gt;${solr.autosoftcommit.maxtime:-1}&lt;/maxtime&gt;

修改4:vimserver/solr/configsets/data_driven_schema_configs/conf/solrconfig.xml

&lt;opensearcher&gt;false&lt;/opensearcher&gt;

&lt;maxdocs&gt;10000&lt;/maxdocs&gt;

&lt;maxdocs&gt;1000&lt;/maxdocs&gt;

要注意的是,如果想在solr中再次添加mongodb中中的key作为索引元素,需要编辑solrcore中的schema.xml中的内容。下面的一个例子是:

&lt;?xml version="1.0" encoding="utf-8" ?&gt;

&lt;schema name="example" version="1.5"&gt; 

 &lt;types&gt;     

  &lt;fieldtype name="string" class="solr.strfield" sortmissinglast="true" /&gt;  

&lt;fieldtype name="boolean" class="solr.boolfield" sortmissinglast="true"/&gt;  

&lt;fieldtype name="int" class="solr.trieintfield" precisionstep="0" positionincrementgap="0"/&gt;      

&lt;fieldtype name="float" class="solr.triefloatfield" precisionstep="0" positionincrementgap="0"/&gt;      

&lt;fieldtype name="long" class="solr.trielongfield" precisionstep="0" positionincrementgap="0"/&gt;     

&lt;fieldtype name="double" class="solr.triedoublefield" precisionstep="0" positionincrementgap="0"/&gt;  

&lt;fieldtype name="date" class="solr.triedatefield" precisionstep="0" positionincrementgap="0"/&gt;  

&lt;!--  

        &lt;fieldtype name="text_ik" class="solr.textfield"&gt;       

&lt;analyzer class="org.wltea.analyzer.lucene.ikanalyzer"/&gt;      

&lt;/fieldtype&gt;  

--&gt;    

&lt;fieldtype name="text_general" class="solr.textfield" positionincrementgap="100"&gt;  

&lt;analyzer type="index"&gt;

&lt;tokenizer class="solr.standardtokenizerfactory"/&gt;

&lt;filter class="solr.stopfilterfactory" ignorecase="true" words="stopwords.txt" /&gt;

&lt;!-- in this example, we will only use synonyms at query time

&lt;filter class="solr.synonymfilterfactory" synonyms="index_synonyms.txt" ignorecase="true" expand="false"/&gt;

&lt;filter class="solr.lowercasefilterfactory"/&gt;  

  &lt;/analyzer&gt;  

&lt;analyzer type="query"&gt;

&lt;filter class="solr.synonymfilterfactory" synonyms="synonyms.txt" ignorecase="true" expand="true"/&gt;

&lt;filter class="solr.lowercasefilterfactory"/&gt;  

&lt;/analyzer&gt;      

&lt;/fieldtype&gt;  

&lt;/types&gt;    

&lt;fields&gt;      

&lt;field name="_version_" type="long" indexed="true" stored="true"/&gt;      

&lt;field name="_id" type="string" indexed="true" stored="true" /&gt;      

&lt;field name="_ts" type="long" indexed="true" stored="true" /&gt;     

&lt;field name="ns" type="string" indexed="true" stored="true"/&gt;   

&lt;field name="doclibrayid" type="string" indexed="true" stored="true"/&gt;      

&lt;field name="originaldocpath" type="string" indexed="true" stored="true"/&gt;      

&lt;field name="htmldocpath" type="string" indexed="true" stored="true" /&gt;      

&lt;field name="originalfilename" type="string" indexed="true" stored="true"/&gt;      

&lt;field name="majorid" type="string" indexed="true" stored="true"/&gt;   

&lt;field name="majorname" type="string" indexed="true" stored="true"/&gt;      

&lt;field name="propertyid" type="string" indexed="true" stored="true"/&gt;      

&lt;field name="propertyname" type="string" indexed="true" stored="true"/&gt;      

&lt;field name="wordnum" type="int" indexed="true" stored="true"/&gt;      

&lt;field name="paragnum" type="int" indexed="true" stored="true"/&gt;      

&lt;field name="sentencenum" type="int" indexed="true" stored="true"/&gt;  

&lt;field name="content" type="text_general" indexed="false" stored="true" multivalued="true"/&gt;  

&lt;/fields&gt;  

&lt;uniquekey&gt;_id&lt;/uniquekey&gt;  

&lt;defaultsearchfield&gt;majorname&lt;/defaultsearchfield&gt;  

&lt;solrqueryparser defaultoperator="or"/&gt;

&lt;/schema&gt;

回到执行mongodb-connector命令的所在位置:

找到:oplog.timestamp,然后删除。同样,也可以删除mongo-connector.log这个文件

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引

进入索引的存放目录:

cd /home/software/solr-5.3.1/server/solr/docdetection/data

删除生成的所有的索引信息rm -rf *    (注意目录在:cd /home/software/solr-5.3.1/server/solr/docdetection/data)

然后再执行:

重启solr,命令在博文的上面:

Solr(搜索引擎服务)和MongoDB通过mongodb-connector进行数据同步的解决方案,以及遇到的各种坑的总结(针对solr-5.3.x版本),mongodb和solr实现实时增量索引