1.6.3 Uploading Data with Solr Cell using Apache Tika

1. Uploading Data with Solr Cell using Apache Tika

  solr使用Apache Tika工程的代碼提供了一個框架,用於合併全部不一樣格式的文件解析器爲solr本身的解析器,如Apache PDFBox,Apache POI.經過這個框架,solr使用ExtractingRequestHandler來上傳二進制文件.html

  若是想要solr使用你本身的ContentHandler,你須要繼承ExtractingRequestHandler,重寫createFactory()方法.這個方法主要用於構建SolrContentHandler和Tika互動.並容許字面值來覆蓋Tika解析的值.設置參數literalsOverride,默認爲true.爲false的話,在Tika解析值的後面添加字面值.java

  關於Solr 抽取請求的更多信息,參考 https://wiki.apache.org/solr/ExtractingRequestHandlernode

1.1 key的概念

  在使用Solr Cell時,瞭解一下信息對你是頗有幫助的:apache

  • solr將會自動嘗試肯定文檔類型(word,pdf,html),抽取恰當的內容.若是你想,你可使用steam.type爲tika指定一個明確的MIME類型.
  • Tika工做 生成一個XHTML流提供給SAX ContentHandler.SAX是一個許多不一樣XML解析器實現的通用接口.更多信息參考  .  http://www.saxproject.org/quickstart.html
  • solr而後響應Tika的SAX事件,建立字段到索引中.
  • solr生成元數據如title,subject,Author.參考 http://tika.apache.org/1.4/formats.html的文件類型支持部分.
  • solr抽取全部的文本到content字段.這個字段在schema.xml中定義爲stored.
  • 能夠映射solr的元數據到solr的字段中,也能夠對這些字段加權.
  • 你能夠爲字段值傳入字面量值.字面量值將會覆蓋Tika解析的值,包含Tika元數據對象中的字段,Tika的內容字段,任何能夠獲取的Tika 內容字段.
  • 可使用XPath表達式到Tika的XHTML中,限制產生的內容.

  提示:儘管Apache Tika是很強大的,可是PDF文件是特別有問題的,這主要是因爲在PDF格式自己.在處理任何文件時若是發生失敗,ExtractingRequestHandler不具備二手準備機制來抽取文件的文本,它將會拋出一個異常.ruby

1.2 Trying out Tika with the Solr Example Directory

cd example -jar start.jar

  在新的命令行窗口,打開docs/目錄,經過 HTTP POST發送文件到solr中.app

curl 'http://localhost:8983/solr/update/extract?literal.id=doc1&commit=true' -F
"myfile=@tutorial.html"

  上面的URL調用了Extraction Request Handler,上傳了tutorial.html文件,定義了惟一主鍵id爲doc1,-F標記說明使用Content-Type:multipart/form-data,並支持上傳二進制文件.@符號說明了上傳的文件附件.  myfile=@tutorial.html指定了一個有效的路徑.能夠是絕對的也能夠時相對的.(如myfile=@../../site/tutorial.html,若是仍舊在exampledocs目錄下的話.)框架

  也許已經注意到,在檢索的時候,雖然能夠檢索文本的內容,可是看不到text的內容,這是由於Tika產生的 "content"字段映射到solr的"text"字段,solr的這個字段沒有存儲.這個操做能夠經過  /update/extract 句柄的默認映射規則來改變.例如,存儲,並看到全部元數據和內容:curl

curl
'http://localhost:8983/solr/update/extract?literal.id=doc1&uprefix=attr_&fmap.content=
attr_content&commit=true' -F "myfile=@tutorial.html"

  這個參數 uprefix=attr_使solr的schema.xml中全部沒有定義的字段前面都加上attr_字樣.attr_在schema.xml中做爲一個動態存儲字段.fmap.content=attr_content參數覆蓋了默認的fmap.content=text.使content添加到了attr_content字段.ide

1.3 Input Parameters

    Extraction Request Handler可以接受的參數:測試

參數 描述
boost.<fieldname> 爲指定字段加權
capture

捕獲指定的XHTML元素,支持添加到solr文檔中.這個參數在複製XHTML中的某一起內容到指定字段時,很是有用.例如,它能夠搜索<p>,索引它們到一個特別的字段.注意:content仍舊被抓取到整個"content"字段.

captureAttr 索引Tika XHTML的屬性到單獨的字段.若是設置爲true,例如,從HTML中抽取內容時,Tika能夠返回<a>標籤元素中的href屬性做爲"a"字段.參考下面例子.
commitWithin 在指定毫秒時間內提交索引到磁盤
date.formats 定義文檔識別的日期格式
defaultField 若是uprefix參數沒有指定,字段不能被識別的時候,使用這個默認字段.
extractOnly

默認時false,若是爲true,返回這個Tika抽取的內容,不索引這個文檔.這在響應中逐字的包含抽取的XHTML字符串.在手動查看時,相對於xml來講它多是更有用.以免查看更多的嵌入的XHTML標籤.參考http://wiki.apache.org/solr/TikaExtractOnlyExampleOutput.

extractFormat 默認時"xml".另一個格式是"text".-x 表示xml  -t 表示text格式.只有在extractOnly爲true的時候,這個參數纔會有效.
fmap.<source_field> source_field必須是輸入文檔的字段,它的值是須要映射到的solr的字段.例如 fmap.content=text使Tika生成的content字段內容移動到solr的text字段
literal.<fieldname> 使用指定的值佔據solr的字段.這個數據能夠是多值的若是這個字段是多值類型的話.
 lowernames  (true/false).若是爲true,全部字段都被映射爲小寫帶有下劃線.例如:"Content-Type"被映射爲"content_type"
 multipartUploadLimitInKB  在上傳大文件時頗有用.定義容許文檔的KB大小.
 passwordsFile  Defines a file path and name for a file of file name to password mappings.
 resource.name  文件名,Tika可使用這個文件名肯定文件MIME類型.
 resource.password  PDF或者OOXML文件可能使用的密碼
 tika.config  定義了tika的配置文件.只有在你自定義實現Tika時纔要求使用.
 uprefix  全部schema中沒有定義的字段使用的前綴匹配.聯合動態字段使用是很是有用的.例如uprefix=ignored_將有效忽略全部Tika產生的未知字段.schema中包含 <dynamicField name="ignored_*" type="ignored"/>.

 xpath

 在抽取時,只返回Tika XHTML中知足xpath表示的內容.參考http://tika.apache.org/1.4/index.html了解更多 Tika XHTML的細節.一樣參考http://wiki.apache.org/solr/TikaExtractOnlyExampleOutput

 

1.4 Order of Operations

  這裏是使用Solr Cell操做的順序,使用Extraction Request Handler 和Tika, 處理它的輸入.

  1. Tika產生字段,傳入literal.<fieldname>=<value>中指定的字面量值給對應字段.若是literalsOverride=false,字面量值將最爲多值添加在Tika產生的字段的值以後.
  2. lowernames=true,字段映射爲小寫.
  3. 經過指定 parameters. fmap.source=target參數,Tika使用映射規則.
  4. 若是指定uprefix,任何未知字段名前都要加上這個值,不然,若是指定defaultField,任何未知字段都複製到這個默認字段.

1.5 配置solr ExtractingRequestHandler

  這是solrconfig.xml中ExtractingRequestHandler的配置例子:

<requestHandler name="/update/extract"
    class="org.apache.solr.handler.extraction.ExtractingRequestHandler">
    <lst name="defaults">
        <str name="fmap.Last-Modified">last_modified</str>
        <str name="uprefix">ignored_</str>
    </lst>
    <!--Optional. Specify a path to a tika configuration file. See the Tika 
        docs for details. -->
    <str name="tika.config">/my/path/to/tika.config</str>
    <!-- Optional. Specify one or more date formats to parse. See DateUtil.DEFAULT_DATE_FORMATS 
        for default date formats -->
    <lst name="date.formats">
        <str>yyyy-MM-dd</str>
    </lst>
</requestHandler>

 

  date.formats容許指定多種java.text.SimpleDateFormats日期格式用於轉換抽取的輸入內容爲日期格式.solr配置了下面的日期格式(參考solr的DateUtil):

  yyyy-MM-dd'T'HH:mm:ss'Z'
  yyyy-MM-dd'T'HH:mm:ss
  yyyy-MM-dd
  yyyy-MM-dd hh:mm:ss
  yyyy-MM-dd HH:mm:ss
  EEE MMM d hh:mm:ss z yyyy
  EEE, dd MMM yyyy HH:mm:ss zzz
  EEEE, dd-MMM-yy HH:mm:ss zzz
  EEE MMM d HH:mm:ss yyyy

  

  若是提交的文件比較大,使用下面限制:

<requestDispatcher handleSelect="true" >
<requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="20480" />
...

 

1.6 Multi-Core Configuration

  對於多核配置,在solr.xml的<solr>元素部分指定sharedLib='lib'屬性,使solr可以找到位於example/solr/lib中的jar包.

  關於solr 多核的更多信息,參考. The Well-Configured Solr Instance.

1.7 Indexing Encrypted Documents with the ExtractingUpdateRequestHandler

  使用ExtracingUpdateRequestHandler索引加密文檔.

  若是solr在請求中提供resource.password或者提供文件passwordsFile來講明密碼的話,ExtractingRequestHandler將會解密加密文件.

  在passwordsFile的例子中,passwordsFile中每行指定一個加密規則.

# This is a comment
myFileName = myPassword
.*\.docx$ = myWordPassword
.*\.pdf$ = myPdfPassword

 

1.8 例子

  1.8.1 Metadata

  正如以前提到的,Tika生成了文檔的元數據,元數據描述了文檔的不一樣的方面,如做者名字,頁數,文件大小等等.元數據的生成主要依賴於文件類型.例如PDFs具備和Word文檔不一樣的元數據.

  除了Tika的元數據之外,solr添加了一下的元數據 (在ExtractingMetadataConstants中定義):

solr元數據 描述
stream_name 這個Conent Stream的名字
stream_source_info 這個Conent Stream的源信息
stream_size 這個Conent Stream的字節大小
stream_content_type 這個Conent Stream的content type

 

 

 

 

 

 

  注意:咱們推薦使用extractOnly選項,來發現爲solr的元數據設置相應的值.

  1.8.2 Examples of Uploads Using the Extraction Request Handler

    1.8.2.1 Capture and Mapping

  捕獲 <div>標籤,映射這個字段的全部實例到動態字段foo_t中:

curl
"http://localhost:8983/solr/update/extract?literal.id=doc2&captureAttr=true&defaultFie
ld=text&fmap.div=foo_t&capture=div" -F "tutorial=@tutorial.pdf"

 

    1.8.2.2 Capture, Mapping, and Boosting

  獲 <div>標籤,映射這個字段的全部實例到動態字段foo_t中,對字段加權爲3.

curl
"http://localhost:8983/solr/update/extract?literal.id=doc3&captureAttr=true&defaultFie
ld=text&capture=div&fmap.div=foo_t&boost.foo_t=3" -F "tutorial=@tutorial.pdf"

 

    1.8.2.3 Using Literals to Define Your Own Metadata

curl
"http://localhost:8983/solr/update/extract?literal.id=doc4&captureAttr=true&defaultFie
ld=text&capture=div&fmap.div=foo_t&boost.foo_t=3&literal.blah_s=Bah" -F
"tutorial=@tutorial.pdf"

 

    1.8.2.4 XPath

  下面例子中的XPath表達式是爲了限制Tika返回的XHTML.

curl
"http://localhost:8983/solr/update/extract?literal.id=doc5&captureAttr=true&defaultFie
ld=text&capture=div&fmap.div=foo_t&boost.foo_t=3&literal.id=id&xpath=/xhtml:html/xhtml
:body/xhtml:div/descendant:node()" -F "tutorial=@tutorial.pdf"

 

 1.8.3 Extracting Data without Indexing It

  solr容許只抽取數據,不創建索引.若是你想用solr做爲一個抽取服務或者是作抽取測試.能夠經過設置extractOnly=true參數來完成.

curl "http://localhost:8983/solr/update/extract?&extractOnly=true" --data-binary
@tutorial.html -H 'Content-type:text/html'

 

  這個輸出包含了Tika生成的XML(and further escaped by Solr's XML);使用不一樣的輸出格式:

curl "http://localhost:8983/solr/update/extract?&extractOnly=true&wt=ruby&indent=true"
--data-binary @tutorial.html -H 'Content-type:text/html'

 

  1.8.4 Sending Documents to Solr with a POST

curl "http://localhost:8983/solr/update/extract?literal.id=doc5&defaultField=text"
--data-binary @tutorial.html -H 'Content-type:text/html'

 

  1.8.5 Sending Documents to Solr with Solr Cell and SolrJ

  solrJ是一個java客戶端,你能夠添加文檔到索引中,更新索引,查詢索引.能夠在 Client APIs中查找更多相關信息.

  這是一個使用 Solr Cell and SolrJ添加文檔的例子:

  首先,使用SolrJ建立一個SolrServer,而後構造一個包含ContentStream的請求(本質上時圍繞一個文件的封裝),而後發送給solr:

        public class SolrCellRequestDemo {
            public static void main (String[] args){color} throws IOException,SolrServerException {
              SolrServer server = new HttpSolrServer("http://localhost:8983/solr");
              ContentStreamUpdateRequest req = new ContentStreamUpdateRequest("/update/extract");
              req.addFile(new File("apache-solr/site/features.pdf"));
              req.setParam(ExtractingParams.EXTRACT_ONLY, "true");
              NamedList<Object> result = server.request(req);
              System.out.println("Result: " + result);
            }

 

1.9 Related Topics

  ExtractingRequestHandler

相關文章
相關標籤/搜索