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. 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

1.6.3 Uploading Data with Solr Cell using Apache Tika的更多相关文章

  1. 1.6.2 Uploading Data with Index Handlers

    1.Uploading Data with Index Handlers 索引处理器就是Request Handlers,用于添加,更新,删除索引中的文档.另外,使用Tika抽取富文档数据,使用Dat ...

  2. 1.6.4 Uploading Structured Data Store Data with the Data Import Handler

    1.使用DIH上传结构化数据 许多搜索应用索引结构化数据,如关系型数据库.DIH提供了一个这样的存储并索引结构化数据的机制.除了关系型数据库,solr可以索引来自HTTP的内容,基于数据源如RSS和A ...

  3. 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 ...

  4. [转]大数据hadoop集群硬件选择

      问题导读 1.哪些情况会遇到io受限制? 2.哪些情况会遇到cpu受限制? 3.如何选择机器配置类型? 4.为数据节点/任务追踪器提供的推荐哪些规格? 随着Apache Hadoop的起步,云客户 ...

  5. 为Hadoop集群选择合适的硬件配置

    随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...

  6. Lucene的入门

    Lucene准备 Lucene可以在官网上下载,我这里已经下载好了,用的是4.10.3版本的, 解压以后的文件为: 如果没有使用maven管理的话,就需要引入这三个jar包,实现lucene功能. 我 ...

  7. 为你的 Hadoop 集群选择合适的硬件

    随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...

  8. 企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[1]

    转载:http://quweiprotoss.wap.blog.163.com/ Push data to Solr or have Solr pull it 尽管一个应用通过HTTP方式与Solr通 ...

  9. 企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[1] (转)

    Index Data Author: David Smiley Eric Pugh 译者:Koala++ / 屈伟 在这一章中我们将了解如何将数据传入Solr.这个传入的过程称之为索引,尽管中间还包含 ...

随机推荐

  1. Windows Azure使用必读(转)

    原文:http://www.cnblogs.com/dyllove98/archive/2013/06/15/3137528.html 近些日子帮了不少用户移植应用到了Windows Azure上,在 ...

  2. Swift 可选值(Optional Values)介绍

    Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil.此 ...

  3. HD1000A + B Problem

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...

  4. [置顶] Linux信号相关笔记

    最近又温习了一遍Linux中的信号知识,发现有很多东西以前没有注意到,就通过这篇博客记录一下,巩固一下知识点. 一,信号基础: 信号是什么?为了回答这个问题,首先要从异常说起,这里的异常不是指c++/ ...

  5. Spring中的设计模式

    [Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用]    [http://www.geek521.c ...

  6. MES总结:CBF.Common 文件Net下的有类型转换

    MES总结:CBF.Common 文件Net下的有类型转换. using System.Text;using System.Data;using System.ComponentModel;using ...

  7. Chrome developer tool:本人钟爱的 console、Network 功能简谈

    在最开始时,本人调试查看网页,一直用的是 firefox 的 firebug 插件,并没有使用 chrome 的 developer tool .只不过,在日常生活使用过程中,一直使用的是 chrom ...

  8. Java Zip压缩实现

    最近在自学javaWeb,先复习一下java,把还给老师的东西再找回来(知识如果不用很快就会忘记啊).. 今天看到了zip压缩,决定要整理一下. java将有关zip压缩的内容都封装在java.uti ...

  9. 利用FlashPaper实现类似百度文库功能

    最近需要实现一个类似百度文库的功能,在Google上淘了一段时间,发现FlashPaper还算能够不错的实现此需求. 首先讲下思路: 1>安装FlashPaper: 2>利用java代码将 ...

  10. Hard problem

    1022: Hard problem Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 43   Solved: 12 Description The ...