2 SOLR2:SOLR整合TOMCAT+导入数据并创建索引+solrj操作

来源:互联网 发布:生活垃圾的数据 编辑:程序博客网 时间:2024/06/06 04:07

【标题:solr整合TOMCAT+导入数据并创建索引+solrj操作】

【说明:这里是我这两天学习solr的一个整理,有很多不详细的地方,但是都可以在网上找到!】

一 solr整合tomcat
1 下载solr:http://lucene.apache.org/solr/,解压(不同版本解压得到的文件夹可能不一样,我用的是solr4.10.1)


2 把solr客户端(注意这里是客户端)部署到TOMCAT:将solr-4.10.0\example\webapps\solr.war   到  apache-tomcat-8.0.12\webapps\目录中


3 建立solr的core

(1)core:Solr里面的core就像数据库里面的一个表,用来管理索引和相关配置
(2)最简单的办法是:

直接把solr-4.10.1\example\solr全部拷贝过去就行,例如放到D:\solr\...,这样solr的core就建好了

目录如下图:


(3)solr建好了后,要告诉solr客户端core在哪里,配置tomcat中你发布的solr项目(solr.war解压生成的或者tomcat启动解析生成的),找到下面这一段,打开注释,红色部分修改为你的core的路径就行:

<env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>E:/apache-tomcat-6.0.39/bin/solr</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
 </env-entry>

二 导入数据并创建索引(索引就是filed):数据库(以oracle为例)和文件(以pdf为例)

(一)导入oracle数据库并创建索引:

1 导入3个jar包到tomcat solr客户端WEB-INF中的lib:

(1)solr-dataimporthandler-extras-4.7.0.jar;在solr发布包solr-4.7.0\dist里面有

(2)solr-dataimporthandler-4.7.0.jar;在solr发布包solr-4.7.0\dist里面有

(3)oracle的驱动jar包


2 告诉solr的core我配置了一个数据库源

(1)修改core里面的solrConfig.xml:

  1. <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">    
  2.  <lst name="defaults">    
  3.   <str name="config">data-config.xml</str>    
  4.  </lst>    
  5. </requestHandler> 

(2)新建data-config.xml(在core里面的conf文件夹里新建,与solr一个目录),其中有一些中文注释请好好读一下:

<?xml version="1.0" encoding="UTF-8" ?>    <dataConfig>      <dataSource type="JdbcDataSource" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:heer_oa_dev/heerok@59.173.240.149:1521:heer" user="heer_oa_dev" password="heerok"/>        <document>          <entity name="OA_SETTING" query="SELECT ID,SJ,SZ,SCRQ from OA_SETTING">              <field column="ID" name="id" />            <!-- 1 column与数据库中的对应                  2这里的name一定要在schema.xml中的filed中定义,我这里用的dynamicField -->               <field column="SJ" name="sj_s" />            <!-- 最后的查询结果的列的显示:            1 query和filed中都有的字段才会被查出来            2 字段名称是name的值             -->            <field column="SZ" name="sz_s" />           <field column="SCRQ" name="scrq_dt" />        </entity>      </document>   </dataConfig>  

(3)修改schema.xml(这里有所有的字段,对应着data-config.xml里面的name,里面的_s _dt都是dynamicField),schema.xml中的filed就是索引的字段,filedType是索引字段的类型,下面给一个日期类型的例子:

<dynamicField name="*_dt"  type="date"    indexed="true"  stored="true"/>

<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>


(二)导入文件并创建索引,以PDF为例子

1 导入jar包:

(1)在core下面新建文件夹extract,把solr-4.7.0\contrib\extraction\lib下所有jar包到extract文件夹下

(2)把solr-4.10.1/dist和solr-4.10.1/contrib都直接拷贝到core下面去,最后的结果如下图所示


说明:为什么要把这么多的jar包都拷贝过去,用于solrconfig.xml中的lib,如果没有导入这些jar包的话,在后面用sorlj操作的时候会报classnotfound的错误(如果你仔细的话会发现里面有很多重复的jar包,你可以直接找出来然后把jar包都放到extra文件夹中)

(3)修改solrConfig.xml:

这里配置的uprefix的意思是:

也就是solr在解析文件的时候,文件本身有很多属性,具体有哪些属性是不确定的,solr全部把他解析出来以attr作为前缀加上文件本身的属性名。这个attr_就是索引了,也就是字段,所以在schema中也要配置。

  1. <requestHandler name="/update/extract" class="solr.extraction.ExtractingRequestHandler" >  
  2.    <lst name="defaults">  
  3.     <str name="fmap.content">text</str>  
  4.     <str name="lowernames">true</str>  
  5.     <str name="uprefix">attr</str>   (attr_) 
  6.     <str name="captureAttr">true</str>  
  7.    </lst>  
  8.   </requestHandler>  

(这里原来是../../)

 <lib dir="E:\apache-tomcat-6.0.39\bin\solr\extract" regex=".*\.jar" />  
  <lib dir="../contrib/extraction/lib" regex=".*\.jar" />
  <lib dir="../dist/" regex="solr-cell-\d.*\.jar" />
  <lib dir="../contrib/clustering/lib/" regex=".*\.jar" />
  <lib dir="../dist/" regex="solr-clustering-\d.*\.jar" />
  <lib dir="../contrib/langid/lib/" regex=".*\.jar" />
  <lib dir="../dist/" regex="solr-langid-\d.*\.jar" />
  <lib dir="../contrib/velocity/lib" regex=".*\.jar" />
  <lib dir="../dist/" regex="solr-velocity-\d.*\.jar" />

(突然看到还有下面这个地方要改,漏掉了,data下面放的是索引文件的二进制文件)

<dataDir>${solr.data.dir:E:/apache-tomcat-6.0.39/bin/solr/collection1/data}</dataDir>

(4)这个attr_就是索引了,也就是字段field,所以也需要在schema.xml中配置:

 <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>


三 用solrj操作:这里没有用Junit,直接写的main

package com.heer;import java.io.File;import java.io.IOException;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServer;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.HttpSolrServer;import org.apache.solr.client.solrj.request.AbstractUpdateRequest;import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.client.solrj.response.UpdateResponse;import org.apache.solr.common.SolrDocumentList;import org.apache.solr.common.SolrInputDocument;import org.apache.solr.common.params.ModifiableSolrParams;import org.apache.solr.common.params.SolrParams;public class SolrExample {private static SolrServer server = new HttpSolrServer("http://localhost:8080/solr/");public final static void fail(Object o) {System.out.println(o);}public static void query(String query) {SolrParams params = new SolrQuery(query);try {QueryResponse response = server.query(params);SolrDocumentList list = response.getResults();for (int i = 0; i < list.size(); i++) {fail(list.get(i));}} catch (SolrServerException e) {e.printStackTrace();}}public static void addDoc() {SolrInputDocument doc = new SolrInputDocument();doc.addField("id", 1);doc.addField("name","Solr Input Document");doc.addField("manu", "this is SolrInputDocument content");doc.addField("mytest","my test solr Solr");try {// 添加一个doc文档UpdateResponse response = server.add(doc);fail("server.commit():   "+server.commit());// commit后才保存到索引库fail("response:  "+response);fail("query time:" + response.getQTime());fail("Elapsed Time:" + response.getElapsedTime());fail("status:" + response.getStatus());} catch (SolrServerException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}query("name:solr");}public static void addBean(){    Index index = new Index();      index.setId("4");      index.setName("add bean index");      index.setManu("index bean manu");      index.setCat(new String[] { "a1", "b2" });            try {           //添加Index Bean到索引库          UpdateResponse response = server.addBean(index);          fail(server.commit());//commit后才保存到索引库          fail(response);      } catch (SolrServerException e) {          e.printStackTrace();      } catch (IOException e) {          e.printStackTrace();      }      queryAll();  }public static void queryAll() {      ModifiableSolrParams params = new ModifiableSolrParams();      // 查询关键词,*:*代表所有属性、所有值,即所有index      params.set("q", "*:*");      // 分页,start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。      params.set("start", 0);      params.set("rows", Integer.MAX_VALUE);            // 排序,,如果按照id 排序,,那么将score desc 改成 id desc(or asc)      //params.set("sort", "score desc");        // 返回信息 * 为全部 这里是全部加上score,如果不加下面就不能使用score      params.set("fl", "*,score");            try {          QueryResponse response = server.query(params);                    SolrDocumentList list = response.getResults();          for (int i = 0; i < list.size(); i++) {              fail(list.get(i));          }      } catch (SolrServerException e) {          e.printStackTrace();      }  }  public static void main(String[] args) {//addDoc();//addBean();String fileName = "F:/Apache_Shiro开发文档.pdf";           String solrId = "Apache_Shiro开发文档.pdf";           try {              indexFilesSolrCell(fileName, solrId);          }          catch (IOException e)          {              e.printStackTrace();          }          catch (SolrServerException e)          {              e.printStackTrace();          }  } /** 从文件创建索引      * <功能详细描述>      * @param fileName      * @param solrId      * @see [类、类#方法、类#成员]      */  public static void indexFilesSolrCell(String fileName, String solrId)           throws IOException, SolrServerException      {          String urlString = "http://localhost:8080/solr/collection1";          SolrServer solr = new HttpSolrServer(urlString);          ContentStreamUpdateRequest up = new ContentStreamUpdateRequest("/update/extract");                    String contentType="application/pdf";          up.addFile(new File(fileName), contentType);          up.setParam("literal.id", solrId);          up.setParam("uprefix", "attr_");          up.setParam("fmap.content", "attr_content");          up.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);          solr.request(up);          SolrQuery query = new SolrQuery("*:*");        QueryResponse rsp = solr.query(query);          System.out.println(rsp);     }  }


阅读全文
0 0