Solr 数据导入快速入门

红薯 发布于 2010/04/08 16:59
阅读 6K+
收藏 15

原文出处:http://blog.chenlb.com/2010/03/solr-data-import-quick-start.html

大概在 solr 1.3 刚出来的时候(2008 年底)就用过 DataImportHandler(DIH),当时觉得很方便的。后来由于有好多限制,就自己写了个做索引的框架。现有个简单的应用要用 dih 来做(小数据量的表,可以用它来做)。备忘记录下。

DataImportHandler 最大的优点是基本不用写代码,把数据库(其实也可以用 http/file 资源)中的记录放到索引中。现大概看下步骤:

1、编辑 solrconfig.xml 注册一个请求 uri 为 "/dataimport" 的请求处理器(org.apache.solr.handler.dataimport.DataImportHandler),代码如:

  1. <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">  
  2. <lst name="defaults">  
  3.   <str name="config">data-config.xml</str>  
  4. </lst>  
  5. </requestHandler>  

2、创建 data-config.xml 文件放到 solr.home/conf 目录下,内容如下:

  1. <dataConfig>  
  2.   <dataSource type="JdbcDataSource"  
  3.               driver="com.mysql.jdbc.Driver"  
  4.               url="jdbc:mysql://localhost/dbname"  
  5.               user="user-name"  
  6.               password="password"/>  
  7.   <document>  
  8.     <entity name="id"  
  9.             query="select id,name from mytable">  
  10.     </entity>  
  11.   </document>  
  12. </dataConfig>  

3、在 schema.xml 里创建 id 与 name 的字段声明。

4、把 mysql 的 jdbc.jar 放到 solr.home/lib 目录下。

5、启动 solr 后,执行命令:

http://localhost:8080/solr/dataimport?command=full-import 这 url 告诉 solr 做全量索引,做索引中会删除所有数据。当然也可以用 clean=false 参数来告诉它不删除,但也会删除相同id的(在 scheam.xml 的uniqueKey 声明的)。http://localhost:8080/solr/dataimport?command=full-import&clean=false

上面的是 mysql 字段与 scheam.xml 声明的一样,当然不一样时可以用 sql 的 as 来使它们一样。

还可以用 data-config.xml 里指定,如:

  1. <dataConfig>  
  2.   <dataSource type="JdbcDataSource"  
  3.               driver="com.mysql.jdbc.Driver"  
  4.               url="jdbc:mysql://localhost/dbname"  
  5.               user="user-name"  
  6.               password="password"/>  
  7.   <document>  
  8.     <entity name="id"  
  9.             query="select id,name from mytable">  
  10.        <field column="id" name="solr_id"/>  
  11.        <field column="name" name="solr_name"/>  
  12.     </entity>  
  13.   </document>  
  14. </dataConfig>  

entity/field 中的 name 是指 scheam.xml 里指定的,column 是 sql 里出来的字段。

大多数,做索引时的数据不是在一个表里的,比较一对多的。DIH 还提供多表取数据。

把 data-config.xml 改为:

  1. <dataConfig>  
  2.   <dataSource type="JdbcDataSource"  
  3.               driver="com.mysql.jdbc.Driver"  
  4.               url="jdbc:mysql://localhost/dbname"  
  5.               user="user-name"  
  6.               password="password"/>  
  7.   <document>  
  8.     <entity name="outer"  
  9.             query="select id,name,desc from mytable">  
  10.        <field column="id" name="solr_id"/>  
  11.        <field column="name" name="solr_name"/>  
  12.        <entity name="inner"  
  13.                query="select details from another_table where id ='${outer.id}'">  
  14.               <field column="details" name="solr_details"/>  
  15.        </entity>  
  16.     </entity>  
  17.   </document>  
  18. </dataConfig>  

在 scheam.xml 里指定 solr_details 字段为多值的 multiValued="true"。在上面 inner entity 里的 sql 语句可以加参数 ${outer.id} 就是 mytable 的 id 字段。

修改好后,重启,再做一次索引就有效果了,一对多一个缺点是会有 N+1 个 sql 查询。对小数据量的索引合适用 solr data import。

参考:http://wiki.apache.org/solr/DIHQuickStart

加载中
0
李剑
李剑

呵呵.这个学习了...好东西!!!

0
VictorLi
VictorLi

请问红薯老大,在用从MYSQL导入数据时,如果其数据库中的数据本身不是用UTF-8编码的,在导入时如何保证中文不乱码呢?

0
紫鹰王
紫鹰王
请问红薯老大,在建索引的时候会连接很多次的数据库       有什么好的优化方案啊   先谢谢了
0
f
frank_007

请问红薯老大和楼上兄弟,我用delta-import生成索引总是无效,请赐教,db-config如下:

<document name="appinfo">

        <entity name="appentity" pk="id" 
            query="select id,appid, appname, intro from appstore_souapp_threepart_app"
            deltaImportQuery="select id,appid, appname, intro  from appstore_souapp_threepart_app where id ='${appentity.id}'">
            <field column="id" name="id" />
            <field column="appid" name="appid" />
            <field column="appname" name="appname" />
            <field column="intro" name="intro" />
        </entity>
    </document>

紫鹰王
紫鹰王
增量生成索引最好是deletedPkQuery,deltaImportQuery和deltaQuery三个语句配合使用 建议你去看下文档
0
f
frank_007
full-import 太麻烦,不能每次数据库中增加一条记录,就做full-import,这样效率太低,请指教!
紫鹰王
紫鹰王
用楼上的delta-import
0
freejavaster
freejavaster

请问各位,solr导入mysql 

<str name="Total Rows Fetched">1</str>  成功

<str name="Total Documents Failed">1</str> 失败

是什么问题?

返回顶部
顶部