solr DataImportHandler怎么用 从数据库建索引
来源:互联网 发布:ftd2009淘宝店 编辑:程序博客网 时间:2024/05/08 04:17
/***************************************/ >>参考:http://wiki.apache.org/solr/DIHQuickStart/***************************************/ 0.概要 solr可以将很多的东西作为数据源,其中包括数据库, 这边是关于如何将数据库作为solr的索引数据源,然后从数据库 中读取数据建立索引到对应的solrcore中去。>>分析:和solr的分布式索引的ReplicationHandler一样DataImportHandler也是solr的几个core功能的实现点,如果需要使用数据库导入建立索引就需要在solrconfig.xml中将他配置上去就行了。 DataImportHandler最大的优点是基本不用写代码,把数据库(其实也可以用 http/file资源)中的记录放到索引中。/***************************************//***************************************/1.编辑 solrconfig.xml 注册一个请求 path 为 "/dataimport" 的请求处理器(org.apache.solr.handler.dataimport.DataImportHandler),代码如: <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>/***************************************//***************************************/2.创建 data-config.xml文件放到 solr.home/conf目录下,内容如下: <dataConfig> <dataSource type="JdbcDataSource" driver="com.microsoft.jdbc.Driver" url="jdbc:microsoft:sqlserver://host_name:port;DatabaseName=data" user="user-name" password="password"/> <document> <entity name="id" query="select id,name from mytable"/> </document> </dataConfig> /***************************************//***************************************/3.在 schema.xml 里创建 id 与 name 的字段声明。/***************************************//***************************************/4.把 sqlServer 的 jdbc.jar 放到 solr.home/lib或者直接考到项目的classpath下。/***************************************//***************************************/5.启动 solr 后,执行命令:>>HTTP控制DataImportHandler API:>http://host_name:port/webapp_name/dataimport?command=full-import这URL告诉 solr做全量索引,做索引中会删除所有数据。当然也可以用 clean=false 参数来告诉它不删除,但也会删除相同id的(在 scheam.xml 的uniqueKey 声明的)。>http://host_name:port/webapp_name/dataimport?command=full-import&clean=false上面的是 sqlserver字段与scheam.xml声明的一样,当然不一样时可以用 sql的 as来使它们一样。还可以用 data-config.xml里指定,如: //<dataConfig> //<dataSource type="JdbcDataSource" // driver="com.microsoft.jdbc.Driver" // url="jdbc:microsoft:sqlserver://host_name:port;DatabaseName=data" // user="user-name" // password="password"/> //<document> //<entity name="id" // query="select id,name from mytable"> //<field column="id" name="solr_id"/> //<field column="name" name="solr_name"/> //</entity> //</document> //</dataConfig> //entity/field中的 name是指scheam.xml里指定的,column是sql里出来的字段。>>DIH多表取数据:data-config.xml配置: //<dataConfig> //<dataSource type="JdbcDataSource" // driver="com.microsoft.jdbc.Driver" // url="jdbc:microsoft:sqlserver://host_name:port;DatabaseName=data" // user="user-name" // password="password"/> //<document> //<entity name="outer" // query="select id,name,desc from mytable"> //<field column="id" name="solr_id"/> //<field column="name" name="solr_name"/> //<entity name="inner" // query="select details from another_table where id ='${outer.id}'"> // <field column="details" name="solr_details"/> //</entity> //</document> //</dataConfig> //在 scheam.xml里指定 solr_details字段为多值的 multiValued="true"。 //在上面 inner entity 里的 sql 语句可以加参数 ${outer.id}就是 mytable的id字段。 //一对多一个缺点是会有 N+1个 sql查询,对小数据量的索引合适用DataImportHandler/***************************************/