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
在使用Solr Cell时,了解一下信息对你是颇有帮助的:apache
提示:尽管Apache Tika是很强大的,可是PDF文件是特别有问题的,这主要是因为在PDF格式自己.在处理任何文件时若是发生失败,ExtractingRequestHandler不具备二手准备机制来抽取文件的文本,它将会抛出一个异常.ruby
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
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 |
这里是使用Solr Cell操做的顺序,使用Extraction Request Handler 和Tika, 处理它的输入.
这是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" /> ...
对于多核配置,在solr.xml的<solr>元素部分指定sharedLib='lib'属性,使solr可以找到位于example/solr/lib中的jar包.
关于solr 多核的更多信息,参考. The Well-Configured Solr Instance.
使用ExtracingUpdateRequestHandler索引加密文档.
若是solr在请求中提供resource.password或者提供文件passwordsFile来讲明密码的话,ExtractingRequestHandler将会解密加密文件.
在passwordsFile的例子中,passwordsFile中每行指定一个加密规则.
# This is a comment
myFileName = myPassword
.*\.docx$ = myWordPassword
.*\.pdf$ = myPdfPassword
正如以前提到的,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的元数据设置相应的值.
捕获 <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"
获 <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"
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"
下面例子中的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"
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'
curl "http://localhost:8983/solr/update/extract?literal.id=doc5&defaultField=text" --data-binary @tutorial.html -H 'Content-type:text/html'
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); }