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/***************************************/