索引數據源並不會必定來自於數據庫、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
- <requestHandler name="/update/extract" class="solr.extraction.ExtractingRequestHandler" >
- <lst name="defaults">
- <str name="fmap.content">text</str>
- <str name="lowernames">true</str>
- <str name="uprefix">attr_</str>
- <str name="captureAttr">true</str>
- </lst>
- </requestHandler>
指定依賴包位置:
注意,這個相對位置不是相對於配置文件所在文件夾位置,而是相對core主目錄的。好比個人配置文件在solr_home\core1\conf, 可是個人jar包在solr_home\ extract那麼個人相對路徑就是../extract而不是../../extract。
[html] view plain copy
- <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


- <types>
- <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
- <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
- <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
- <analyzer type="index">
- <tokenizer class="solr.StandardTokenizerFactory"/>
- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
- <filter class="solr.LowerCaseFilterFactory"/>
- </analyzer>
- <analyzer type="query">
- <tokenizer class="solr.StandardTokenizerFactory"/>
- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
- <filter class="solr.LowerCaseFilterFactory"/>
- </analyzer>
- </fieldType>
- </types>
4.2配置索引字段,也就是field
其中有個動態類型字段,attr_*,這個是什麼意思呢。也就是solr在解析文件的時候,文件自己有不少屬性,具體有哪些屬性是不肯定的,solr所有把他解析出來以attr做爲前綴加上文件自己的屬性名,組合在一塊兒就成了field的名稱
[html] view plain copy


- <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
- <field name="text" type="text_general" indexed="true" stored="true"/>
- <field name="_version_" type="long" indexed="true" stored="true"/>
-
- <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>
到這裏solr服務端的配置以及完成了。
2、solrj測試
一、 須要的jar

Maven配置
[html] view plain copy


- <dependency>
- <groupId>org.apache.solr</groupId>
- <artifactId>solr-solrj</artifactId>
- <version>4.7.0</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.3.2</version>
- <scope>test</scope>
- </dependency>
二、 測試類CreateIndexFromPDF.Java
Solrj4.7裏面ContentStreamUpdateRequest的addFile方法多了一個contentType參數,指明內容類型。ContentType請參看:http://baike.baidu.com/link?url=panQQa04z0gc4-gQRnIoUhwOQPABfG6unIqE1-7SEe5ZMygYxWT2lkvoKlQmTEYIZDNhntB4T9aGQM5KhevKDa
[java] view plain copy


- package com.clj.test.solr.solrj;
-
- 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;
-
- /**
- * 從PDF建立索引
- * <功能詳細描述>
- *
- * @author Administrator
- * @version [版本號, 2014年3月18日]
- * @see [相關類/方法]
- * @since [產品/模塊版本]
- */
- public class CreateIndexFromPDF
- {
-
- public static void main(String[] args)
- {
- String fileName = "e:/MyBatis3用戶指南中文版.pdf";
- String solrId = "MyBatis3用戶指南中文版.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/core1";
- 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);
-
- QueryResponse rsp = solr.query(new SolrQuery("*:*"));
- System.out.println(rsp);
- }
-
- }
執行上面代碼,便把咱們的pdf文件上傳到solr服務器,解析、建立索引,後面的solr.query是執行一個查詢,查詢解析索引後結果。解析後pdf就變成了純文本的內容,在控制檯能夠看到不少文檔其餘信息。
Solr解析完pdf、建立索引後,咱們也能夠在solr的管理界面查看索引結果。Core1s就是咱們新建的文件索引庫。以下圖。
