1.添加dataimport:编辑${catalina_home}\solr_config\solr\collection1\conf\solrconfig.xml,在最后添加以下内容;
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
<?xml version="1.0" encoding="UTF-8"?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/solr" user="root" password="123"/> <document name="messages"> <!--文件表 --> <entity name="luyou" pk="id" transformer="ClobTransformer" query="select id,title,content from luyou" deltaQuery="select id,title,content from luyou where createdTime > '${dataimporter.last_index_time}'" > <field column="id" name="id" /> <field column="title" name="title"/> <field column="content" name="content"/> </entity> </document> </dataConfig>
3.将相关jar包copy到${catalina_home}\webapps\solr\WEB-INF\lib中,主要有三个包。mysql, solr-dataimporthandler-4.2.1.jar和solr-dataimporthandler-extras-4.2.1.jar;
4.编辑${catalina_home}\solr_config\solr\collection1\conf\schema.xml,将几个相关字段的属性添加上。因为原始文档中已经存在这几个字段名,所以此处做部分修改,此处如有不解可以参看下solr的配置文档;
<field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/> <field name="content" type="text_general" indexed="false" stored="true" multiValued="true"/> <!--创建一个新字段--> <field name="luyou" type="text_ik" indexed="true" stored="true" multiValued="true"/> <!--统一搜索--> <!-- Text fields from SolrCell to search by default in our catch-all field --> <copyField source="title" dest="luyou"/> <copyField source="content" dest="luyou"/>
5.启动tomcat,直接访问 http://localhost:8983/solr/import?command=full-import,如果成功,会有相关消息显示有多少条数据index, 同时在${catalina_home}\solr_config\solr\collection1\conf\dataimport.properties中会产生一个dataimport.properties文件,其中记录最后index时间,这个是增量index的时间标致,标识下次index从哪里开始,原则上数据库中应该有个时间字段与其比较。手动插入几条数据,将时间设为标识之后,然后访问 /dataimport?command=delta-import,可见增量的index数据;
6.client端测试:相关jar包 solr-4.2.1\dist\solrj-lib中的所有包及solr-4.2.1\dist\solr-solrj-4.2.1.jar,执行以下程序,可看到结果;
package com.solr.client; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; //solr客户端调用 public class SolrJSearch { String url = "http://localhost:8080/solr"; HttpSolrServer solrServer =null; /** * 初始化CommonsHttpSolrServer */ public SolrJSearch(){ solrServer = new HttpSolrServer(url); solrServer.setMaxTotalConnections(100); solrServer.setSoTimeout(10000); solrServer.setConnectionTimeout(5000); } /** * 全文检索方法 */ public void search(String keywords){ SolrQuery query = new SolrQuery(); query.setQuery(keywords); //设置合并 query.setFacet(true); query.setHighlight(true) .setHighlightSnippets(3) .setHighlightSimplePre("<span class='highlight'>")//设置开头 .setHighlightSimplePost("</span>") //设置结尾 //.setParam("hl.mergeContiguous", "true") .setParam("hl.fl", "content,title"); //.setStart(0) //.setRows(10);//设置行数 //新加条件(and的作用对TERM_VAL的6到8折的限制) //query.addFilterQuery("content:EditText"); //排序用的 //query.addSortField( "price", SolrQuery.ORDER.asc ); try { QueryResponse rsp = solrServer.query( query ); SolrDocumentList docs = rsp.getResults(); System.out.println("数据匹配个数:" + docs.getNumFound()); System.out.println("查询时间:" + rsp.getQTime()); for (SolrDocument doc : docs) { String id = (String) doc.getFieldValue("id"); if(rsp.getHighlighting().get(id)!=null){ System.out.println("id is "+id); System.out.println(rsp.getHighlighting().get(id).get("title")); System.out.println(rsp.getHighlighting().get(id).get("content")); } // String content = (String) doc.getFieldValue("content"); // String title = (String) doc.getFieldValue("title"); // System.out.println("id:"+id); // System.out.println("content:"+content); // System.out.println("title:"+title); System.out.println("-------------------"); } } catch (SolrServerException e) { e.printStackTrace(); } } /** * 测试方法 */ public static void main(String[] args) { SolrJSearch sj = new SolrJSearch(); sj.search("什么"); } }