Index Data
Author: David Smiley Eric Pugh
译者:Koala++ / 屈伟
在这一章中我们将了解如何将数据传入Solr。这个传入的过程称之为索引,尽管中间还包含了导入的过程。本章的结构如下:
l 与Solr交互。
l 以Solr的Update-XML格式发送数据。
l 提交,优化,回滚和删除。
l 以CSV 格式发送数据。
l 通过Solr的DataImportHandler直接读数据库和XML。
l 通过Solr的ExtractingRequestHandler从富文档中抽取数据。
l 用UpdateRequestProcessors进行文档后处理(post-processing)。
你会在第九章看到一些相关的内容,第九章中有语言绑定,框架集成,包括爬虫。大都用Solr的Update-XML格式。
Communicating With Solr
Solr提供了很多导入数据的方式。在本节中,我们将先介绍一些方法,给出一些交互的例子。一些特定格式,比如Solr的Update-XML的细节随后介绍。
Direct HTTP or a convenient client API
应用与Solr通过HTTP方式交互,你可以选择直接用你喜欢的HTTP客户端API,也可以使用与Solr集成的API,比如SolrJ或是Sunspot,它们将处理与HTTP交互的细节。这些API将在第九章介绍。HTTP Solr交互并不意味着需要索引的数据一定要通过HTTP传输,你马上会学习到如何告诉Solr去取数据。
Push data to Solr or have Solr pull it
尽管一个应用通过HTTP方式与Solr通信,并不意味着它需要将文档通过HTTP发送给Solr。Solr支持一种它称为remote streaming的方式,这种方式需要提供给它一个URL,它可以是一个HTTP URL,但一般它是一个基于文件系统的URL,基于文件系统的URL,可以在数据已经在Solr所在的本机或是在网络驱动中时可以使用。这种方式减少了HTTP方式的代价。另一种方式是让Solr通过DataImportHandler去拉取数据,这种方式可以从数据库和其它来源拉取数据。DIH提供了一个可扩展的框架,它可以扩展以适应自定义的数据源。
Data formats
下面是多种在Solr用来建索引的格式:
l Solr的Update-XML:Solr接受一种通过XML格式表达的Solr特定的格式。它也有删除,优化和提交的命令。
? 其它XML:任意的XML带上一个XSLT文件给Solr,Solr会将XML转化成Update-XML格式以进行后面的处理。
? Solr的Update-JSON:Solr的Update-XML的一个JavaScript Object Notation变形。更多细节见http://wiki.apache.org/solr/UpdateJSON。
? Java-Bin:Solr的Update-XML的一个高效的二进制变形。正式地只有SolrJ客户端API支持,但也有第三方的Ruby支持。
? CSV:逗号(或其它符号)分隔符的格式。
? 富文档:大多数常见的文件格式,比如PDF,XLS,DOC,PPT。文本和元数据都可以从这些格式中抽取出来,并放入Solr的域中。这可以通过Solr Cell Contrib模式完成。
我们将通过把MusicBrainz的数据以XML,CSV和数据库的方式导入Solr来展示Solr的能力。其它的例子将展示通过DIH将爬取的文件导入,和通过Solr Cell导入。但是通常来说一个应用只会用一种格式来导入。
在我们介绍这些方法之前,我们先介绍一下cURL和remote streaming,这两个是基本知识。
HTTP POSTing options to Solr
Solr通过HTTP POST接收命令,还可以接收文档数据。
发送HTTP POST的方法之一是使用UNIX命令行工具curl,我们将用它来介绍例子。另一个跨平台的工具是Solr中post.jar,它在Solr的example/exampledocs目录下。要得到一些使用信息,用下面的命令运行:
>> java –jar example/exampledocs/post.jar -help
有几种让Solr索引数据的方式,并所有的方式都是通过HTTP POST:
l 通过POST方式发送数据。curl的--data-binary参数可以做到这点,并会带一个与格式相符的content-type头。
l 发送一些类似一个HTML格式的键值对。Curl使用-F来进行。如果你不是在数据库中得到数据,你可以用下面的方式来进行:
? 将数据放在stream.body参数中。如果它比较小,也许小于1M,这种方式没有问题。大小的限制是在solrconfig.xml的multipartUpdateLimitInKB中,默认是2GB。如果你想提高限制,你应该再考虑一下你的方式。
? 用stream.file参数引用Solr服务器上的一个本地文件,或是通过stream.url参数通过一个URL去取数据。这些方式Solr称之为remote streaming。
下面是第一种选择的例子。我们假设有一个artists.xml在当前目录。我们可以用下面的命令Post这个文件。
>> curl http://localhost:8983/solr/mbartists/update -H 'Contenttype:text/xml; charset=utf-8' --data-binary @artists.xml
如果它成功了,你会得到下面的输出:
0128
要用stream.body来完成上例,你可以写:
curl http://localhost:8983/solr/mbartists/update -F stream.body=@artists.xml
在两个例子中,@符号指示curl从文件中取得数据。如果XML比较短,你可以直接在命令行中写:
curl http://localhost:8983/solr/mbartists/update -F stream.body=' '
注意在值中有一个空格,这是有意为之的。在本例中,curl对待@和 |