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來上傳二進制文件.
如果想要solr使用你自己的ContentHandler,你需要繼承ExtractingRequestHandler,重寫createFactory()方法.這個方法主要用于構建SolrContentHandler和Tika互動.并允許字面值來覆蓋Tika解析的值.設置參數literalsOverride,默認為true.為false的話,在Tika解析值的后面添加字面值.
關于Solr 抽取請求的更多信息,參考?https://wiki.apache.org/solr/ExtractingRequestHandler
1.1 key的概念
在使用Solr Cell時,了解一下信息對你是很有幫助的:
- 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不具有二手準備機制來抽取文件的文本,它將會拋出一個異常.
1.2 Trying out Tika with the Solr Example Directory
cd example -jar start.jar在新的命令行窗口,打開docs/目錄,通過?HTTP POST發送文件到solr中.
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 '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字段.
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.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
?
轉載于:https://www.cnblogs.com/a198720/p/4310563.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的1.6.3 Uploading Data with Solr Cell using Apache Tika的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EF optimize the perf
- 下一篇: oracle11G在linux环境下的卸