07、solr学习-solr之数据库数据导入生成索引(DataImportHandler)-基于solr搜索引擎

写程序可以将数据读出100条,如果你的内存够大,可以是1000条甚至更多,然后放入Collection中,批量提交至solr。或者读取数据写入xml文件中,再将该文件提交到solr等等。但是,我们还可以通过配置文件直接读取数据库建立索引。
两种方式:1) 全量更新索引 2) 增量更新索引

创建索引方式

1、 solr的客户端调用solrj建索引+分页查询;

创建数据库测试表

create table DELTA\_IMPORT  
(  
IDNUMBER(15) not null,  
WARECODE VARCHAR2(500),  
WARENAME VARCHAR2(500),  
WARE\_STATUS VARCHAR2(500),  
LAST\_MODIFIED DATE  
)  

新增测试数据

2、 solr从数据库建立索引;
Index a DB table directly into Solr

Step 1 : Edit your solrconfig.xml to add the request handle


```xml
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">D:/Dev/appservers/solr\_server/webapps/solr/db/db-config.xml</str>
</lst>
</requestHandler>
```
Step 2 : Create a data-config.xml file as follows and save it to the conf dir
```xml
<dataConfig>
<dataSource type="JdbcDataSource"
driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@192.168.204.135:1521:mydb"
user="ngves3"
password="asiainfo"/>
<document name="full\_import" pk="ID">
<entity name="fullImport"
transformer="ClobTransformer"
query="select \* from delta\_import" >
<field column="ID" name="id" />
<field column="wareCode" name="wareCode"/>
<field column="wareName" name="wareName" />
<field column="wareStatus" name="wareStatus" />
</entity>
</document>
</dataConfig>
```
Step 3 : Ensure that your solr schema (schema.xml) has the fields 'id', 'TITLE', 'CONTENT','SENDTIME'. Change the appropriate details in the data-config.xml
Step 4: Drop your JDBC driver jar file into the /lib directory
Step 5 : Run the command
> http://solr-host:port/solr/dataimportcommand=full-import
Keep in mind that every time a full-import is executed the index is cleaned up. If you do not wish that to happen add clean=false. For example:
http://solr-host:port/solr/dataimportcommand=full-import&clean=false
Index data from multiple tables into Solr
Step: 1 Change the data-config as follows :
Step 2: The schema.xml should have the solr\_details field
Step 3: Run the full-import command
访问地址: http://192.168.204.135:9081/solr/admin/dataimport.jsp
第一种情况:
full-import : "完全导入"这个操作可以通过访问URL http://192.168.0.248:9080/solr/dataimportcommand=full-import 完成。
这个操作,将会新起一个线程。response中的attribute属性将会显示busy。
这个操作执行的时间取决于数据集的大小。
当这个操作运行完了以后,它将在conf/dataimport.properties这个文件中记录下这个操作的开始时间
当“增量导入”被执行时,stored timestamp这个时间戳将会被用到
solr的查询在“完全导入”时,不是阻塞的
它还有下面一些参数:
* clean : (default 'true'). 决定在建立索引之前,删除以前的索引。
* commit : (default 'true'). 决定这个操作之后是否要commit
* optimize : (default 'true'). 决定这个操作之后是否要优化。
* debug : (default false). 工作在debug模式下。详情请看 the interactive development mode (see here )
编写JAVA程序模拟 http://192.168.204.135:9081/solr/dataimport?clean=true&commit=true&command=full-import
**1、** 配置文件:;
```xml
<dataConfig>
<dataSource type="JdbcDataSource"
driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@192.168.204.135:1521:mydb"
user="ngves3"
password="asiainfo"/>
<document name="full\_import" pk="ID">
<entity name="fullImport"
transformer="ClobTransformer"
query="select \* from delta\_import" >
<field column="ID" name="id" />
<field column="wareCode" name="wareCode"/>
<field column="wareName" name="wareName" />
<field column="wareStatus" name="wareStatus" />
</entity>
</document>
</dataConfig>
```
**2、** 测试代码;
```java
public void testFullImportByHttpClient() throws Exception{
logger.info("start create index from db!");
String result = null;
String urlAddr = null;
Map<String, String> param = null;
try{
urlAddr = "http://192.168.204.135:9081/solr/dataimport";
param = new HashMap<String, String>();
param.put("clean", "true");//对于索引创建完成不需要删除的内容可以设置为false,例如: 积分商城搜索设置为false
param.put("commit","true");//commit设置true后,才会真正更新索引索引库
param.put("command","full-import");
result = HttpHelper.doPost(urlAddr, param);
if(logger.isInfoEnabled()){
logger.info("result = " + result);
}
logger.info("success create index!");
}catch (Exception e) {
e.printStackTrace();
throw e;
}
}
```
第二种情况:
delta-import : 当遇到一些增量的输入,或者发生一些变化时使用http://192.168.0.248:9080/solr/dataimport?command=delta-import它同样支持 clean, commit, optimize and debug 这几个参数
**1、** 配置文件;
```xml
<dataConfig>
<dataSource type="JdbcDataSource"
driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@192.168.204.135:1521:mydb"
user="ngves3"
password="asiainfo"/>
<document name="delta\_import" >
<entity name="deltaImport" pk="ID"
transformer="ClobTransformer"
query="select \* from delta\_import"
deltaQuery="select id from delta\_import where
to\_char(last\_modified,&#039;YYYY-MM-DD HH24:MI:SS&#039;) > &#039;$\{dataimporter.last\_index\_time\}&#039;">
<field column="ID" name="id" />
<field column="wareCode" name="wareCode"/>
<field column="wareName" name="wareName" />
<field column="wareStatus" name="wareStatus" />
</entity>
</document>
</dataConfig>
```
**2、** 测试代码;
```java
public void testDeltaImportByHttpClient() throws Exception{
logger.info("start create index from db!");
String result = null;
String urlAddr = null;
Map<String, String> param = null;
try{
urlAddr = "http://192.168.204.135:9081/solr/dataimport";
param = new HashMap<String, String>();
param.put("clean", "false");//对于索引创建完成不需要删除的内容可以设置为false,例如: 积分商城搜索设置为false
param.put("commit","true");//commit设置true后,才会真正更新索引索引库
param.put("command", "delta-import");//增量创建索引
result = HttpHelper.doPost(urlAddr, param);
if(logger.isInfoEnabled()){
logger.info("result = " + result);
}
logger.info("success create index!");
}catch (Exception e) {
e.printStackTrace();
throw e;
}
}
```
第三种情况:
status : 想要知道命令执行的状态 , 访问 URL http://192.168.0.248:9080/solr/dataimport .它给出了关于文档创建、删除,查询、结果获取等等的详细状况
第四种情况:
reload-config : 如果data-config.xml已经改变,你不希望重启solr,而要重新加载配置时,运行一下的命令http://192.168.0.248:9080/solr/dataimport?command=reload-config
第五种情况:
abort : 你可以通过访问 http://192.168.0.248:9080/solr/dataimport?command=abort 来终止一个在运行的操作
文本来自: http://www.cnblogs.com/atyou/archive/2013/04/19/3031323.html
[http_download.csdn.net_detail_shenfuli_6575533]: http://download.csdn.net/detail/shenfuli/6575533