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, 处理它的输入.
- Tika产生字段,传入literal.<fieldname>=<value>中指定的字面量值给对应字段.如果literalsOverride=false,字面量值将最为多值添加在Tika产生的字段的值之后.
- lowernames=true,字段映射为小写.
- 通过指定 parameters. fmap.source=target参数,Tika使用映射规则.
- 如果指定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
1.6.3 Uploading Data with Solr Cell using Apache Tika的更多相关文章
- 1.6.2 Uploading Data with Index Handlers
1.Uploading Data with Index Handlers 索引处理器就是Request Handlers,用于添加,更新,删除索引中的文档.另外,使用Tika抽取富文档数据,使用Dat ...
- 1.6.4 Uploading Structured Data Store Data with the Data Import Handler
1.使用DIH上传结构化数据 许多搜索应用索引结构化数据,如关系型数据库.DIH提供了一个这样的存储并索引结构化数据的机制.除了关系型数据库,solr可以索引来自HTTP的内容,基于数据源如RSS和A ...
- 1.6 Indexing and Basic Data Operations--目录
1.6.1 什么是 Indexing 1.6.2 Uploading Data with Index Handlers 1.6.3 Uploading Data with Solr Cell usin ...
- [转]大数据hadoop集群硬件选择
问题导读 1.哪些情况会遇到io受限制? 2.哪些情况会遇到cpu受限制? 3.如何选择机器配置类型? 4.为数据节点/任务追踪器提供的推荐哪些规格? 随着Apache Hadoop的起步,云客户 ...
- 为Hadoop集群选择合适的硬件配置
随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...
- Lucene的入门
Lucene准备 Lucene可以在官网上下载,我这里已经下载好了,用的是4.10.3版本的, 解压以后的文件为: 如果没有使用maven管理的话,就需要引入这三个jar包,实现lucene功能. 我 ...
- 为你的 Hadoop 集群选择合适的硬件
随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...
- 企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[1]
转载:http://quweiprotoss.wap.blog.163.com/ Push data to Solr or have Solr pull it 尽管一个应用通过HTTP方式与Solr通 ...
- 企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[1] (转)
Index Data Author: David Smiley Eric Pugh 译者:Koala++ / 屈伟 在这一章中我们将了解如何将数据传入Solr.这个传入的过程称之为索引,尽管中间还包含 ...
随机推荐
- 解析XtraBackup备份MySQL的原理和过程(转)
原文:http://ourlinux.blog.51cto.com/274624/844859 XtraBackup是percona公司提供的开源工具,以热备Innodb表著称而被广泛采用. Xtra ...
- Unity3D Keynote
[Unity3D Keynote] 1.场景文件扩展名为.unity. 2.up为Y正方向,down为Y负方向,right为X正方向,left为X负方向,forward为Z正方向,back为z负方向. ...
- fastscript调用delphi方法和DELPHI调用FASTSCRIPT方法
fastscript调用Delphi过程: 1. 先创建事件处理方法:TfsCallMethodEvent 2. 然后再用调用TfsScript.AddMethod方法,第一个参数为Delphi方法 ...
- apiCode/1/1.1/1.1.1
public abstract class myClass { private string id = ""; private string name = "" ...
- 关于JAVA多线程的那些事__初心者
前言 其实事情的经过也许会复杂了点,这事还得从两个月前开始说.那天,我果断不干IT支援.那天,我立志要做一个真正的程序猿.那天,我26岁11个月.那天,我开始看Android.那天,我一边叨念着有朋自 ...
- perl学习笔记(2)
1)记得刚开始写perl的时候,对于一个功能,总是拿目前能用的数据类型来解决问题,不想想有没有更好的,能用能解决问题就好,这就导致了后期,要在函数里面添加功能的时候,函数要添加很多参数,一个函数有7. ...
- jsp中使用动态数据进行mySQL数据库的两种操作方法
使用动态数据进行数据库内容的增删改查操作有两种方法: 在此定义数据库连接为conn 假设有表单进行数据输入并提交到处理页面一种是使用预编译格式: 其格式如下: String name = reques ...
- sudo权限集中管理用法
#定义一组命令集合,名称DBA_CMD,禁止使用的命令前加!即可Cmnd_Alias DBA_CMD = /bin/touch,/bin/mkdir,/sbin/service,/sbin/chkc ...
- HTML5 progress元素的样式控制、兼容与实例
一.progress元素基本了解 基本UIprogress元素属于HTML5家族,指进度条.IE10+以及其他靠谱浏览器都支持.如下简单code: <progress>o(︶︿︶)o< ...
- 关于.NET邮件的收发问题总结
转载:http://www.cnblogs.com/ustbwuyi/archive/2007/05/28/762581.html //取数据库中邮件信息中的最大发送时间,即最近接收到的一封邮件的时间 ...