lhc0 2014-05-31
Solr接受cvs的格式,进行索引。并且支持multi-valued,你也可能在语法感兴趣的基于XML更新指令。
Solr1.2是最早支持cvs格式更新索引的版本。
CVS的request handler需要在solrconfig.xml中配置,默认已经在solrconfig.xml的配置文件中存在了。
<!-- CSV update handler, loaded on demand -->
<requestHandler name="/update/csv" class="solr.CSVRequestHandler" startup="lazy">
</requestHandler>
在solr4.0中,CVS被用在标准的UpdateRequestHandler中。
<requestHandler name="/update" class="solr.UpdateRequestHandler"/>
请注意,需要包括的内容类型:Content-type:application/csv 或则Content-type:text/csv
上传CSV文件的方法
CVS是通过/solr/update/csv 将文件上传到solr服务器。
有一个样例CSV文件的例子/ exampledocs / books.csv可以用来添加文件到Solr服务器实例。
例子使用HTTP-POST的方式通过网络将CVS文件发送到solr服务器。
cd example/exampledocs
curl http://localhost:8983/solr/update/csv --data-binary @books.csv -H 'Content-type:text/plain; charset=utf-8'
上传一个本地CSV文件可以比在网络上通过HTTP发送更有效。此方法工作,必须远程流是启用的。看到xml下面的行,改变它的enableremotestreaming =“true”,并重新启动Solr。
<requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
以下的请求会导致Solr直接读取输入文件:
curl http://localhost:8983/solr/update/csv?stream.file=exampledocs/books.csv&stream.contentType=text/plain;charset=utf-8
#NOTE: The full path, or a path relative to the CWD of the running solr server must be used.
一些参数可以在每一个领域的基础上通过 f.<fieldname>.param=value。
例如:果CSV文件有多值字段(S)是由不同的分离器分离(S),然后他们可以分泰德基于下列额外的参数传递到 f.<fieldname>.split=true&f.<fieldname>.separator=<separator>或其他方式你可以有多值的域部分相同的CSV不同分离器及可更新,Solr索引基于以上语法。
指定作为字段分隔符的字符。默认是分离器=,
如果第一行的CSV输入包含字段或列名称。默认的header=true,如果字段名的参数是不存在的,这些字段添加文件的索引中也会被使用。
指定要添加文件时使用Solr索引以逗号分隔的字段名列表。如果CSV输入已经有一个标题,名称指定此参数将覆盖。
例如:fieldnames=id,name,category
一个以逗号分隔的字段名列表输入中跳过。另一个跳过的方法是指定它的名字作为字段名长度为一零的字符串。
例子:
fieldnames=id,name,category&skip=name
跳过name字段,相当于
fieldnames=id,,category
指定要丢弃CSV数据开始之前输入流中的行数(包括标题,如果存在的话)。默认是skiplines = 0。
如果true删除前导和尾随空白值。CSV分析已经忽略前导空白默认情况下,但可能有结尾的空格,或可能有空格,被引用,因此不能删除。这可能是指定的全局,或在每一个领域的基础。默认的是trim=false
encapsulator
字符选择用来包围值保存如CSV分隔或空白字符,本标准的CSV格式处理封装器本身出现在一个封装的价值倍增的封装器。
在封装值引号CSV示例:
100,"this is a ""quoted"" string inside an encapsulated value"
默认的 encapsulator="
keepEmpty
指定默认的index为空的值值。这可能是指定的全局,或在每一个领域的基础。默认的是keepempty = false。
literal
所有文件添加固定的字段名称/值。
例如:添加一个“数据源”字段值等于“每个文档的索引从CSV产品”
literal.datasource=products
map
指定一个值与另一个之间的映射。在结肠的LHS的字符串将在右边的字符串替换。此参数可以在每一个领域的基础上在全局或指定。
例如:在每一个地方使用Absolutely替换true
map=Absolutely:true
例如:删除在字段foo中包括RemoveMe的值
f.foo.map=RemoveMe:&f.foo.keepEmpty=false
split
如果是true,该字段值使用另一个CSV解析器被分隔成多个值。CSV解析规则如分离器和封装器,可以在指定参数。
例如:在下面的输入
id,tags
101,"movie,spiderman,action"
为了索引成3个索引标签,并且solr的multi-valued 字段为tags,使用
f.tags.split=true
例如:以下有标签领域的空间分离和封装器输入单引号
id,tags
101,movie 'spider man' action
索引3个单独的标签为多值字段称为“tags”方案,使用
f.tags.split=true&f.tags.separator=%20&f.tags.encapsulator='
任何分裂目标Solr领域应该多值。
rowid
如果不为空,该文件在传入的参数名称字段名称应增加和当前行/ rowid添加新字段的值。如果您的CSV没有唯一的ID,使用cvs的行号也是可以的。如果你只是想指数在正是在原始的CSV文件行来自也有用。
例如:
curl "http://localhost:8983/solr/update?rowid=id" --data-binary @1987.csv -H 'Content-type:application/csv; charset=utf-8'
rowidOffset
在与rowid参数一起,ROWID被添加到field之前,这个整数将被添加到ROWID。
overwrite
如果ture(默认的是true),检查并覆盖重复的文件,基于solr在schema中定义的唯一ID,如果你知道你的索引文件不包含任何副本,然后你想相当大的速度,设置overwrite=false。
提交更改后在这一要求所有记录都被索引。默认是commit=false以避免频繁的潜在性能的影响有。
Disadvantages
有没有办法提供文档或字段索引时提高CSV格式,但是许多指标不利用这一特征。因为updatecsv处理函数在一个较低的水平比dataimporthandler(DIH),内置的功能,但提供了诸如变压器,entityprocessors和进口的命令不可用时,使用updatecsv。也就是说,额外的考虑,应在CSV文件提供的数据格式以及它如何被你的Solr schema充满。
不像DIH,没有一个可查询的方式在执行后知道状态。
不要让“格式”的名字愚弄你,该程序可以加载您的制表符分隔的文件,甚至把斜杠进行转义而不是CSV封装。
例如,一个可以把MySQL表制表符分隔文件
SELECT * INTO OUTFILE '/tmp/result.text' FROM mytable;
此文件可以通过设置隔板选项卡导入Solr(占09)和逃避反斜杠(% 5C)
curl 'http://localhost:8983/solr/update/csv?commit=true&separator=%09&escape=\&stream.file=/tmp/result.text'
参考网址:
http://wiki.apache.org/solr/UpdateCSV