solr導入pdf操做

索引數據源並不會必定來自於數據庫、XML、JSON、CSV這類結構化數據,不少時候也來自於PDF、word、html、word、MP3等這類非結構化數據,從這類非結構化數據建立索引,solr也給咱們提供了很好的支持,利用的是apache  tika。html

下面咱們來看看在solr4.7中如何從pdf文件建立索引。java

 

1、配置文件索引庫數據庫

一、  新建coreapache

咱們新建一個solr的core,用於存儲文件型索引,新建core的步驟請參考:服務器

http://blog.csdn.net/clj198606061111/article/details/21288499app

二、  準備jar測試

咱們在$solr_home下面新建一個extract文件夾,用於存放solr擴展jar包。ui

從colr4.7發佈包中solr-4.7.0\dist拷貝solr-cell-4.7.0.jar到新建的extract文件夾下。拷貝 solr4.7發佈包solr-4.7.0\contrib\extraction\lib下全部jar包到extract文件夾下。url

三、  配置solrconfig.xmlspa

添加請求解析配置:

[html] view plain copy

 

  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>  
  6.     <str name="captureAttr">true</str>  
  7.    </lst>  
  8.   </requestHandler>  

 

指定依賴包位置:

注意,這個相對位置不是相對於配置文件所在文件夾位置,而是相對core主目錄的。好比個人配置文件在solr_home\core1\conf, 可是個人jar包在solr_home\ extract那麼個人相對路徑就是../extract而不是../../extract。

[html] view plain copy

 

  1. <lib dir="../extract" regex=".*\.jar" />  

 

四、配置schema.xml

4.1配置索引字段的類型,也就是field類型。

其中text_general類型咱們用到2個txt文件(stopwords.txt、synonyms.txt),這2個txt文件在發佈包示 例core裏面有位置在:solr-4.7.0\example\solr\collection1\conf,複製這2個txt文件到新建 的$solr_home的那個新建的core下面的conf目錄下,和schema.xml一個位置。

 

[html] view plain copy

在CODE上查看代碼片派生到個人代碼片

  1. <types>  
  2.   <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>  
  3.   <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>  
  4.   <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">  
  5.      <analyzer type="index">  
  6.        <tokenizer class="solr.StandardTokenizerFactory"/>  
  7.        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />  
  8.        <filter class="solr.LowerCaseFilterFactory"/>  
  9.      </analyzer>  
  10.      <analyzer type="query">  
  11.        <tokenizer class="solr.StandardTokenizerFactory"/>  
  12.        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />  
  13.        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>  
  14.        <filter class="solr.LowerCaseFilterFactory"/>  
  15.      </analyzer>  
  16.    </fieldType>  
  17.  </types>  

 

 

4.2配置索引字段,也就是field

其中有個動態類型字段,attr_*,這個是什麼意思呢。也就是solr在解析文件的時候,文件自己有不少屬性,具體有哪些屬性是不肯定的,solr所有把他解析出來以attr做爲前綴加上文件自己的屬性名,組合在一塊兒就成了field的名稱

 

[html] view plain copy

在CODE上查看代碼片派生到個人代碼片

  1. <field name="id"        type="string"       indexed="true"  stored="true"  multiValued="false" required="true"/>  
  2.  <field name="text"      type="text_general" indexed="true"  stored="true"/>  
  3.  <field name="_version_" type="long"         indexed="true"  stored="true"/>  
  4.    
  5.  <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>  

 

 

到這裏solr服務端的配置以及完成了。

2、solrj測試

 

一、  須要的jar

Maven配置

 

[html] view plain copy

在CODE上查看代碼片派生到個人代碼片

  1. <dependency>  
  2.         <groupId>org.apache.solr</groupId>  
  3.         <artifactId>solr-solrj</artifactId>  
  4.         <version>4.7.0</version>  
  5.         <scope>test</scope>  
  6.     </dependency>  
  7.     <dependency>  
  8.         <groupId>org.apache.httpcomponents</groupId>  
  9.         <artifactId>httpclient</artifactId>  
  10.         <version>4.3.2</version>  
  11.         <scope>test</scope>  
  12.     </dependency>  


 

 


二、 測試類CreateIndexFromPDF.Java

Solrj4.7裏面ContentStreamUpdateRequestaddFile方法多了一個contentType參數,指明內容類型。ContentType請參看:http://baike.baidu.com/link?url=panQQa04z0gc4-gQRnIoUhwOQPABfG6unIqE1-7SEe5ZMygYxWT2lkvoKlQmTEYIZDNhntB4T9aGQM5KhevKDa

 

[java] view plain copy

在CODE上查看代碼片派生到個人代碼片

  1. package com.clj.test.solr.solrj;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import org.apache.solr.client.solrj.SolrQuery;  
  7. import org.apache.solr.client.solrj.SolrServer;  
  8. import org.apache.solr.client.solrj.SolrServerException;  
  9. import org.apache.solr.client.solrj.impl.HttpSolrServer;  
  10. import org.apache.solr.client.solrj.request.AbstractUpdateRequest;  
  11. import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;  
  12. import org.apache.solr.client.solrj.response.QueryResponse;  
  13.   
  14. /** 
  15.  * 從PDF建立索引 
  16.  * <功能詳細描述> 
  17.  *  
  18.  * @author  Administrator 
  19.  * @version  [版本號, 2014年3月18日] 
  20.  * @see  [相關類/方法] 
  21.  * @since  [產品/模塊版本] 
  22.  */  
  23. public class CreateIndexFromPDF  
  24. {  
  25.       
  26.     public static void main(String[] args)  
  27.     {  
  28.         String fileName = "e:/MyBatis3用戶指南中文版.pdf";   
  29.         String solrId = "MyBatis3用戶指南中文版.pdf";   
  30.         try  
  31.         {  
  32.             indexFilesSolrCell(fileName, solrId);  
  33.         }  
  34.         catch (IOException e)  
  35.         {  
  36.             e.printStackTrace();  
  37.         }  
  38.         catch (SolrServerException e)  
  39.         {  
  40.             e.printStackTrace();  
  41.         }  
  42.           
  43.     }  
  44.       
  45.     /** 從文件建立索引 
  46.      * <功能詳細描述> 
  47.      * @param fileName 
  48.      * @param solrId 
  49.      * @see [類、類#方法、類#成員] 
  50.      */  
  51.     public static void indexFilesSolrCell(String fileName, String solrId)   
  52.         throws IOException, SolrServerException  
  53.     {  
  54.         String urlString = "http://localhost:8080/solr/core1";  
  55.         SolrServer solr = new HttpSolrServer(urlString);  
  56.         ContentStreamUpdateRequest up = new ContentStreamUpdateRequest("/update/extract");  
  57.           
  58.         String contentType="application/pdf";  
  59.         up.addFile(new File(fileName), contentType);  
  60.         up.setParam("literal.id", solrId);  
  61.         up.setParam("uprefix", "attr_");  
  62.         up.setParam("fmap.content", "attr_content");  
  63.         up.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);  
  64.           
  65.         solr.request(up);  
  66.           
  67.         QueryResponse rsp = solr.query(new SolrQuery("*:*"));  
  68.         System.out.println(rsp);  
  69.     }  
  70.       
  71. }  

 

 

執行上面代碼,便把咱們的pdf文件上傳到solr服務器,解析、建立索引,後面的solr.query是執行一個查詢,查詢解析索引後結果。解析後pdf就變成了純文本的內容,在控制檯能夠看到不少文檔其餘信息。

Solr解析完pdf、建立索引後,咱們也能夠在solr的管理界面查看索引結果。Core1s就是咱們新建的文件索引庫。以下圖。

相關文章
相關標籤/搜索