索引处理器就是Request Handlers,用于添加,更新,删除索引中的文档.另外,使用Tika抽取富文档数据,使用Data Import Handler抽取结构化数据.solr天然也就支持 XML, CSV 和 JSON格式的结构化文档.java
配置并使用request handlers的推荐的方式就是使用基于names的path,在request url中映射path--可是若是request Dispatcher配置合适以后,request handlers也能够指定qt(query type)参数.node
联合的UpdateRequesthandler.apache
在solr4之后,有一个统一的update request handler的方式支持XML,CVS,JSON和javabin更新请求,受权使用ContentStreamLoader,基于ContentSream的Content-Type.json
默认的配置文件有更新请求处理器(update request handler)默认的配置app
<requestHandler name="/update" class="solr.UpdateRequestHandler" />
使用 Content-type: application/xml Content-type:text/xml格式能够发送xml格式消息.dom
update handler识别xml结构的数据的方式是很直接的:curl
例子:性能
<add> <doc> <field name="authors">Patrick Eagar</field> <field name="subject">Sports</field> <field name="dd">796.35</field> <field name="numpages">128</field> <field name="desc"></field> <field name="price">12.40</field> <field name="title" boost="2.0">Summer of the all-rounder: Test and championship cricket in England 1982</field> <field name="isbn">0002166313</field> <field name="yearpub">1982</field> <field name="publisher">Collins</field> </doc> <doc boost="2.5"> ... </doc> </add>
每个元素都有一些能够指定的属性:优化
命令 | 参数 | 参数描述 |
<add> | commitWithin=number | 在指定的毫秒数中添加文档 |
<add> | overwrite=boolean | 默认为ture |
<doc> | boost=float | 默认为1.0 设置文档的权值 |
<field> | boost=float | 默认为1.0 设置字段的权值 |
<commit>操做是将自从上次提交以后的全部文档写入到硬盘上.在提交以前,新的文档对搜素是不可见的,提交操做打开了一个新的searcher,触发任何配置的监听事件.ui
提交操做能够经过<commit/>来发布.也能够经过solrconfig.xml中的<autocommit>来触发.
<optimize>操做要求solr合并内部数据以提升查询性能.对于大索引,合并将会花费一部分时间.若是使用solr的复制(replication)机制跨多个系统分发搜索,注意在作一个优化操做以后,一个完整的索引被传递.
<commit> 和<optimize>的属性:
属性 | 描述 |
maxSegments | 默认为1,索引优化的片断不能超过这个值 |
waitFlush | 默认为true,阻塞直到索引起生变化,冲刷到磁盘上. |
waitSearcher | 默认为true,阻塞,直到打开一个新的searcher,并注册为主查询searcher.使这个改变可视的. |
expungeDeletes | 默认为false,合并片断,删除删除的文档. |
这里是一个提交和优化的例子:
<commit waitFlush="false" waitSearcher="false"/> <commit waitFlush="false" waitSearcher="false" expungeDeletes="true"/> <optimize waitFlush="false" waitSearcher="false"/>
删除文档有两种方式:按照ID删除和按照query删除.不过若是是经过query删除,commitWithin会被忽略.一个删除消息中能够删除多个文档:
<delete> <id>0002166313</id> <id>0031745983</id> <query>subject:sport</query> <query>publisher:penguin</query> </delete>
回滚操做恢复从上一次提交以后的全部增长,删除的数据.它既不调用任何监听事件又不建立新的searcher.它的语法简单<rollback/>
可使用--data-binary 选项来添加xml消息到curl命令中,生成一个HTTP POST请求.例如:
curl http://localhost:8983/update -H "Content-Type: text/xml" --data-binary ' <add> <doc> <field name="authors">Patrick Eagar</field> <field name="subject">Sports</field> <field name="dd">796.35</field> <field name="isbn">0002166313</field> <field name="yearpub">1982</field> <field name="publisher">Collins</field> </doc> </add> '
对于发送一个包含XML消息的文件,可使用:
curl http://localhost:8983/update -H "Content-Type: text/xml" --data-binary @myfile.xml
简短的请求能够经过HTTP GET命令,URL-编码这个请求,注意"<" 和">"的转义:
curl http://localhost:8983/update?stream.body=%3Ccommit/%3E
solr响应:
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">127</int> </lst> </response>
若是失败,状态字段status非0.
UpdateRequestHandler容许索引任意的XML.使用<tr>参数用于XSLT transformation .你必须在solr/conf/xslt目录下有一个样式表.能够转换数据成指望的 format, <add><doc/></add>格式,而且使用tr参数指定样式表的名称.
这是一个XSLT样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <add> <xsl:apply-templates select="/random/document" /> </add> </xsl:template> <xsl:template match="document"> <doc boost="5.5"> <xsl:apply-templates select="*" /> </doc> </xsl:template> <xsl:template match="node"> <field name="{@name}"> <xsl:if test="@enhance!=''"> <xsl:attribute name="boost"><xsl:value-of select="@enhance" /></xsl:attribute> </xsl:if> <xsl:value-of select="@value" /> </field> </xsl:template> </xsl:stylesheet>
这个样式表将solr的XML搜索结果格式转换成Solr的更新XML语法.一个例子就是复制solr1.3的索引(没有CVS响应writer)到一个能够被索引到另一个solr文件的格式(提供全部字段的存储).
http://localhost:8983/solr/select?q=*:*&wt=xslt&tr=updateXml.xsl&rows=1000
在更新的时候,你也可使用XsltUpdateRequestHandler的样式表来转换索引:
curl "http://localhost:8983/solr/update?commit=true&tr=updateXml.xsl" -H "Content-Type: text/xml" --data-binary @myexporteddata.xml
更多关于XML Update Request Handler的信息,参考. https://wiki.apache.org/solr/UpdateXmlMessages.
JSON格式的更新请求,须要发送/update的句柄,使用Content-Type: application/json或者Content-Type: text/json.
默认配置:
<requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler"> <lst name="defaults"> <str name="stream.contentType">application/json</str> </lst> </requestHandler>
例子:
有一个JSON文件在example/exampledocs/books.json,能够添加文档到solr的服务中:
cd example/exampledocs
curl 'http://localhost:8983/solr/update/json?commit=true'
--data-binary @books.json -H 'Content-type:application/json'
URL中添加 commit=true,使文档当即能够搜索.
JSON的更新处理器(handler)接受全部的更新命令.一个消息中能够包含多个命令:
{
"add": {
"doc": {
"id": "DOC1",
"my_boosted_field": { /* use a map with boost/value for a boosted field */
"boost": 2.3,
"value": "test"
},
"my_multivalued_field": [ "aaa", "bbb" ] /* use an array for a multi-valued field */
}
},
"add": {
"commitWithin": 5000, /* commit this document within 5 seconds */
"overwrite": false, /* don't check for existing documents with the same uniqueKey */
"boost": 3.45, /* a document boost */
"doc": {
"f1": "v1",
"f1": "v2"
}
},
"commit": {},
"optimize": {
"waitFlush":false, "waitSearcher":false },
"delete": { "id":"ID" }, /* delete by ID */
"delete": { "query":"QUERY" } /* delete by query */
}
注意:json中是不容许注释的.
正如其余update handler同样, commit, commitWithin, optimize,overwrite也能够在URL中指定.
"delete":"myid"
"delete":["id1","id2"]
更多 JSON Update Request Handler的相关信息,参考 https://wiki.apache.org/solr/UpdateJSON.
CVS格式请求能够发送/update 句柄,使用Content-Type: application/csv或者Content-Type: text/csv.
默认配置:
<requestHandler name="/update/csv" class="solr.CSVRequestHandler"> <lst name="defaults"> <str name="stream.contentType">application/csv</str> </lst> </requestHandler>