您的位置:首页 > 数据库

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

2013-11-19 12:31 746 查看
写程序可以将数据读出100条,如果你的内存够大,可以是1000条甚至更多,然后放入Collection中,批量提交至solr。或者读取数据写入xml文件中,再将该文件提交到solr等等。但是,我们还可以通过配置文件直接读取数据库建立索引。

两种方式:1) 全量更新索引 2) 增量更新索引

其中: 关于全量和增量测试报告详见以下URL:

http://download.csdn.net/detail/shenfuli/6575533

创建索引方式

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

/*创建数据库测试表*/

create table DELTA_IMPORT

(

ID NUMBER(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

<!-- DataImportHandler -->

<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

<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 <solr-home>/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 )

编写J***A程序模拟 http://192.168.204.135:9081/solr/dataimport?clean=true&commit=true&command=full-import
1. 配置文件:

<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. 测试代码

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. 配置文件

<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,'YYYY-MM-DD HH24:MI:SS') > '${dataimporter.last_index_time}'">

<field column="ID" name="id" />

<field column="wareCode" name="wareCode"/>

<field column="wareName" name="wareName" />

<field column="wareStatus" name="wareStatus" />

</entity>

</document>

</dataConfig>

2. 测试代码

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: