如何在Solr 7.2中定义(imei, date)为复合唯一键?
如何在Solr中设置(imei, date)作为复合唯一键
嘿,这个需求我刚好处理过!Solr本身并没有直接支持多字段作为唯一键的原生配置,但我们可以通过两种实用的方法来实现(imei, date)的唯一约束,下面给你详细说明:
方法一:手动生成组合字段(推荐,直观易维护)
这种方法需要我们创建一个拼接了imei和date的组合字段,把它设为Solr的唯一键:
修改Schema定义
在你的schema.xml(或者Solr 6+的managed-schema)中,新增一个字符串类型的字段作为组合唯一键,同时设置它为Solr的<uniqueKey>:<!-- 定义组合唯一键字段 --> <field name="unique_key_combined" type="string" indexed="true" stored="false"/> <!-- 设置为全局唯一键 --> <uniqueKey>unique_key_combined</uniqueKey> <!-- 保留你原有的字段定义 --> <field name="imei" type="string" indexed="true" stored="true"/> <field name="date" type="date" indexed="true" stored="true"/> <field name="gpsdt" type="date" indexed="true" stored="true"/> <field name="odo" type="long" indexed="true" stored="true"/>添加文档时拼接字段值
在向Solr提交文档时,手动将imei和date的值用一个不会出现在字段内容中的分隔符(比如|)拼接起来,赋值给unique_key_combined字段。例如:- 若
imei为"1234567890",date为"2024-05-20T12:00:00Z",则unique_key_combined的值为"1234567890|2024-05-20T12:00:00Z"
- 若
方法二:用UpdateRequestProcessor自动生成组合键
如果不想手动拼接字段,可以通过Solr的更新处理器链自动生成组合唯一键:
配置更新处理器链
在solrconfig.xml中添加一个UpdateRequestProcessorChain,使用ConcatFieldUpdateProcessorFactory来自动拼接imei和date:<updateRequestProcessorChain name="create-composite-unique-key"> <!-- 自动拼接imei和date到组合字段 --> <processor class="solr.ConcatFieldUpdateProcessorFactory"> <str name="fieldName">unique_key_combined</str> <str name="delimiter">|</str> <arr name="sourceFields"> <str>imei</str> <str>date</str> </arr> </processor> <!-- 执行更新操作 --> <processor class="solr.RunUpdateProcessorFactory"/> </updateRequestProcessorChain>关联Schema和处理器链
同样需要在Schema中定义unique_key_combined并设为唯一键(和方法一的Schema配置一致)。然后可以选择:- 在提交文档的请求中指定使用该处理器链:添加URL参数
update.chain=create-composite-unique-key - 或者设置为默认更新处理器,在
solrconfig.xml的<updateHandler>中配置:<updateHandler class="solr.DirectUpdateHandler2"> <str name="update.chain">create-composite-unique-key</str> </updateHandler>
- 在提交文档的请求中指定使用该处理器链:添加URL参数
注意事项
- 选择分隔符时,一定要确保它不会出现在
imei或date的实际值中,避免出现重复的唯一键冲突。 - 如果你的
date字段是Solr的date类型,它会自动以ISO格式存储为字符串,拼接时无需额外处理。 - 若使用SolrCloud集群,记得同步所有节点的配置文件,然后重新加载集合使配置生效。
内容的提问来源于stack exchange,提问作者Rj1
相关产品推荐
相关产品推荐

