浅谈solr-mongo-dataimport

最近项目需要一个全局搜索功能。我们的项目绝大部分数据都是存在mongodb中。搜索引擎准备用solr。
之前因为项目需要,mongodb与solr已经做过一次简单的整合。之所以说简单,是因为只是单表建立索引。用mongo-connector可以很好的将这两者整合。现在这个全局搜索的功能,需要的是多表联合。mongo-connector并不支持此功能。
忽然想到mysql与solr整合,建立索引用的是配置文件的方法。可以进行多表联合查询,mongo和solr能用类似的方法吗?于是就进行各种搜索。百度很久,网上一大片都是mongo-connector的教程。GitHub上有SolrMongoImporter的教程,国内也很少见。所以决定写此篇博客与大家分享经验。如有不足之处请多多指教,后面会贴出GitHub地址。

和mysql-solr整合一样,需要进行一些配置。
本人用的是solr5.5.0,mongo2.4.3。所以以下配置都是基于这两个版本。

配置

jar包管理

  • solr自带jar包
    将solr-5.5.0/dist下的solr-dataimporthandler-5.5.0.jar复制到solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib下面
  • mongo驱动包(后面提供下载地址)
    将驱动包放入solr-5.5.0/server/lib下面
  • solr-mongo-import.jar(后面提供下载地址)
    将此jar包放到solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib下面

xml配置文件

  • 修改solrconfig.xml
    在对应core目录中conf文件夹下的solrconfig.xml中加入以下代码
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
   <lst name="defaults">
      <str name="config">data-config.xml</str>
   </lst>
</requestHandler>
  • data-config.xml配置
    在conf文件夹下建立data-config.xml文件,配置如下:
<?xml version="1.0"?>
<dataConfig>
<!--username:用户名(没有可以不写),password:密码-->
   <dataSource name="kxlist_list" type="MongoDataSource" database="kxlist_list" host="192.168.1.253" port="27017"/>
   <document name="data">
   <!-- if query="" then it imports everything -->
     <entity name="share"
              processor="MongoEntityProcessor"
              query="{'status':'1'}"
              collection="shareResources"
              datasource="kxlist_list"
              transformer="MongoMapperTransformer">
              <field column="id"  name="id" mongoField="_id" />
              <field column="resourceType" name="resourceType" mongoField="resourceType"/>
              <field column="resourceId" name="resourceId" mongoField="resourceId"/>
              <field column="resourceName" name="resourceName" mongoField="resourceName" />
              <field column="shareUserId" name="userId" mongoField="shareId"/>
              <field column="receiveInfo" name="receiveInfo" mongoField="receiveInfo"/>
              <field column="shareType" name="shareType" mongoFiled="shareType"/>


             <!--类似关系型数据库的联合查询-->
            <entity name="commodityList"
                    processor="MongoEntityProcessor"
                    query="{'_id':'${share.resourceId}'}"
                    collection="commoditylist"
                    datasource="kxlist_list"
                    transformer="MongoMapperTransformer">
                    <field column="commodities" name="commodities" mongoField="commodities"/>
                    <field column="listNum" name="listNum" mongoField="num"/>
              </entity>

             <entity name="quotelist"
                    processor="MongoEntityProcessor"
                    query="{'_id':'${share.resourceId}'}"
                    collection="quotelist"
                    datasource="kxlist_list"
                    transformer="MongoMapperTransformer">
                    <field column="commodities" name="commodities" mongoField="commodities"/>
                    <field column="listNum" name="listNum" mongoField="num"/>
              </entity>

              <entity name="demandlist"
                    processor="MongoEntityProcessor"
                    query="{'_id':'${share.resourceId}'}"
                    collection="demandlist"
                    datasource="kxlist_list"
                    transformer="MongoMapperTransformer">
                    <field column="commodities" name="commodities" mongoField="commodities"/>
                    <field column="listNum" name="listNum" mongoField="num"/>
              </entity>

         </entity>
   </document>
 </dataConfig>

参数说明(只介绍个别参数):
dataSource:数据源配置,支持副本集。用“”,“”分割。例如: host=”192.168.1.253,192.168.1.254” port=”27017,27017”
field: ‘column’相当于别名。’name’需要与managed-schema中field名字对应。’mongoField’mongodb数据库字段名字。

  • managed-schema配置
    在此只展示field字段配置,里面也有一些动态字段的配置。
    <field name="_version_" type="long" indexed="true" stored="true"/>
    <field name="_root_" type="string" indexed="true" stored="false"/>
    <field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/>
    <copyField source="*" dest="_text_"/>
    <field name="id" type="string" indexed="true" stored="true" />
    <field name="_ts" type="long" indexed="true" stored="true" />
    <field name="resourceType" type="string"  indexed="false" stored="true"/>
    <field name="resourceId" type="string" indexed="false" stored="true"/>
    <field name="resourceName" type="string" indexed="true" stored="true"/>
    <field name="userId" type="string" indexed="true" stored="true"/>
     <field name="listNum" type="string" indexed="true" stored="true"/>
    <field name="shareType" type="string" indexed="false" stored="true"/>
        <!-- Dynamic field definitions allow using convention over configuration
       for fields via the specification of patterns to match field names.
       EXAMPLE:  name="*_i" will match any field ending in _i (like myid_i, z_i)
       RESTRICTION: the glob-like pattern in the name attribute must have
       a "*" only at the start or the end.  -->
<!--在数据库中是以数组形式存在,需要配置动态字段-->

  <dynamicField name="commodities*" type="string" indexed="true" stored="true"/>
  <dynamicField name="receiveInfo*" type="string" indexed="true" stored="true"/>

至此,配置已经完毕。可以进行导入数据测试。
建立索引测试
导入数据完成之后可以查询测试。
查询数据
大功告成!!

下面提供各种资源地址

最近发现一些网站转载文章不附带原文链接,所以在此亲自贴上。http://blog.csdn.net/u013259845/article/details/53637060

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值