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

【标题: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值