Solr索引:更新处理器与索引机制完整指南
概述
更新处理器(Update Handlers)是专门用于向索引添加、删除和更新文档的请求处理器。除了支持导入富文档的插件外,Solr原生支持XML、CSV和JSON格式的结构化文档索引。
推荐使用基于路径的配置方式来设置请求处理器,这种方式将名称映射到请求URL中的路径。当然,如果请求分发器配置得当,也可以使用qt
(查询类型)参数来指定请求处理器。
统一更新请求处理器
Solr提供了一个统一的更新请求处理器,支持XML、CSV、JSON和JavaBin格式的更新请求。它会根据ContentStream的Content-Type自动委托给适当的ContentStreamLoader。
如果需要在文档加载后但在索引之前(甚至在模式检查之前)对文档进行预处理,Solr为更新请求处理器提供了文档预处理插件,称为更新请求处理器(Update Request Processors),支持默认和自定义配置链。
UpdateRequestHandler配置
默认配置文件已经配置了更新请求处理器:
1 | <requestHandler name="/update" class="solr.UpdateRequestHandler" /> |
XML格式索引更新
添加文档
索引更新命令可以作为XML消息发送到更新处理器,使用Content-type: application/xml
或Content-type: text/xml
。
更新处理器识别的XML模式非常简单:
<add>
元素引入一个或多个要添加的文档<doc>
元素引入构成文档的字段<field>
元素提供特定字段的内容
示例:
1 | <add> |
add命令的可选属性
commitWithin:
- 可选参数,默认值:none
- 在指定的毫秒数内添加文档
overwrite:
- 可选参数,默认值:true
- 指示是否检查唯一键约束以覆盖同一文档的先前版本
如果文档模式定义了唯一键,默认情况下/update
操作会覆盖(即替换)索引中具有相同唯一键的任何文档。如果没有定义唯一键,索引性能会更快,因为不需要检查现有文档。
如果您有唯一键字段,但确信可以安全地绕过唯一性检查(例如,批量构建索引,索引代码保证不会多次添加同一文档),可以在添加文档时指定overwrite="false"
选项。
XML更新命令
提交和优化操作
commit操作:<commit>
操作将自上次提交以来加载的所有文档写入磁盘上的一个或多个段文件。在发出提交之前,新索引的内容对搜索不可见。提交操作会打开新的搜索器,并触发已配置的事件监听器。
可以使用<commit/>
消息显式发出提交,也可以通过solrconfig.xml
中的<autocommit>
参数触发。
optimize操作:<optimize>
操作请求Solr合并内部数据结构。对于大型索引,优化需要一些时间才能完成,但通过将许多小段文件合并为较大的段,可以提高搜索性能。
警告:只应该在静态索引上考虑使用optimize,即可以作为常规更新过程一部分进行优化的索引(比如每天更新一次)。需要NRT功能的应用程序不应使用optimize。
可选属性:
- waitSearcher(默认:true):阻塞直到新搜索器打开并注册为主查询搜索器,使更改可见
- expungeDeletes(默认:false):合并删除文档超过10%的段,在过程中清除删除的文档
- maxSegments(默认:none):尽力将段合并到不超过此数量的段,但不保证能达到目标
示例:
1 | <commit waitSearcher="false"/> |
删除操作
可以通过两种方式删除索引中的文档:
- 按ID删除:删除具有指定ID的文档,只能在模式中定义了UniqueID字段时使用
- 按查询删除:删除匹配指定查询的所有文档
示例:
1 | <delete> |
重要提示:某些查询(包括许多{!join}
和{!graph}
查询)在删除操作中不受支持,会返回400错误。
回滚操作
回滚命令回滚自上次提交以来对索引所做的所有添加和删除。它既不调用事件监听器,也不创建新的搜索器。语法简单:<rollback/>
。
分组操作
可以通过用<update>
元素包围来在单个XML文件中发布多个命令:
1 | <update> |
使用curl执行更新
可以使用curl
实用程序执行上述任何命令:
1 | curl http://localhost:8983/solr/my_collection/update -H "Content-Type: text/xml" --data-binary ' |
对于包含在文件中的XML消息,可以使用:
1 | curl http://localhost:8983/solr/my_collection/update -H "Content-Type: text/xml" --data-binary @myfile.xml |
为了最小化curl内存使用,可以使用:
1 | curl http://localhost:8983/solr/my_collection/update -H "Content-Type: text/xml" -T "myfile.xml" -X POST |
XSLT转换XML索引更新
脚本模块提供了独立的XSLT更新请求处理器,允许通过使用<tr>
参数应用XSL转换来索引任意XML。
必须在configset的conf/xslt
目录中有XSLT样式表,能够将传入数据转换为预期的<add><doc/></add>
格式,并使用tr
参数指定样式表的名称。
XSLT配置示例
1 | <requestHandler name="/update/xslt" |
JSON格式索引更新
Solr可以接受符合定义结构的JSON,也可以接受任意格式的JSON文档。
Solr样式JSON
JSON格式的更新请求可以使用Content-Type: application/json
或Content-Type: text/json
发送到Solr的/update
处理器。
JSON格式的更新可以采用3种基本形式:
添加单个JSON文档
1 | curl -X POST -H 'Content-Type: application/json' 'http://localhost:8983/solr/my_collection/update/json/docs' --data-binary ' |
添加多个JSON文档
1 | curl -X POST -H 'Content-Type: application/json' 'http://localhost:8983/solr/my_collection/update' --data-binary ' |
发送JSON更新命令
1 | curl -X POST -H 'Content-Type: application/json' 'http://localhost:8983/solr/my_collection/update' --data-binary ' |
JSON更新便利路径
Solr提供了几个额外的JSON特定请求处理器路径:
路径 | 默认参数 |
---|---|
/update/json |
stream.contentType=application/json |
/update/json/docs |
stream.contentType=application/json json.command=false |
CSV格式索引更新
CSV格式的更新请求可以使用Content-Type: application/csv
或Content-Type: text/csv
发送到Solr的/update
处理器。
示例:
1 | curl 'http://localhost:8983/solr/my_collection/update?commit=true' --data-binary @example/exampledocs/books.csv -H 'Content-type:application/csv' |
CSV更新参数
CSV处理器允许在URL中以f._parameter_._optional_fieldname_=_value_
的形式指定许多参数:
主要参数:
- separator(默认:
,
):用作字段分隔符的字符 - trim(默认:
false
):如果为true,从值中删除前导和尾随空格 - header(默认:
true
):如果输入的第一行包含字段名称,设置为true - fieldnames:要使用的字段名称的逗号分隔列表
- literal.field_name:指定字段名称的文字值
- skip:要跳过的字段名称的逗号分隔列表
- skipLines(默认:
0
):CSV数据开始前要丢弃的输入流行数 - encapsulator:可选地用于包围值以保留字符的字符
- escape:用于转义CSV分隔符或其他保留字符的字符
- keepEmpty(默认:
false
):保持并索引零长度(空)字段 - map:将一个值映射到另一个值
- overwrite(默认:
true
):基于模式中声明的uniqueKey字段检查并覆盖重复文档 - commit:数据摄取后发出提交
- commitWithin:在指定毫秒数内添加文档
- rowid:将rowid(行号)映射到由参数值指定的字段
- rowidOffset(默认:
0
):在将rowid添加到文档之前添加给定偏移量
索引制表符分隔文件
同样的功能也可以用于索引制表符分隔文件(TSV文件):
1 | curl 'http://localhost:8983/solr/my_collection/update/csv?commit=true&separator=%09&escape=%5c' --data-binary @/tmp/result.txt |
CSV更新便利路径
路径 | 默认参数 |
---|---|
/update/csv |
stream.contentType=application/csv |
性能优化建议
- 批量操作:尽可能批量处理文档,而不是逐个处理
- commitWithin设置:合理设置commitWithin值,平衡实时性和性能
- 避免频繁optimize:只在必要时使用optimize操作
- 字段存储策略:根据查询需求合理配置字段的存储和索引属性
- 内存管理:对于大文件,使用流式处理方法
错误处理
Solr返回的响应格式:
1 | <response> |
状态字段在失败情况下为非零值。
总结
更新处理器是Solr索引系统的核心组件,支持多种数据格式和操作类型。正确配置和使用更新处理器对于构建高效的Solr搜索应用程序至关重要。通过理解各种更新操作的语法和参数,可以有效地管理索引内容,确保数据的准确性和系统的高性能。