我正在使用带有elasticsearch传输插件的couchbase。我的问题是将couchbase文档映射到elasticsearch类型。可以将它映射到elasticsearch.yml:
couchbase.typeSelector:org.elasticsearch.transport.couchbase.capi.RegexTypeSelector couchbase.typeSelector.documentTypesRegex.type:^ type:。+ $
然后在couchbase中将id为“type:123”的文档转换为elasticsearch中的“type”类型。
我不满足于这个解决方案,因为它确定了couchbase中ID字段的类型和格式,导致解决方案不“优雅”,可能会很麻烦。
可以使用例如“_class”字段映射文档吗?使用Java API将文档插入couchbase后出现此字段。我认为这将是更好的解决方案。
感谢您的帮助。
答案 0 :(得分:2)
Couchbase中的文档ID是不可变的,这就是类型选择器基于它的原因。基于某些可变属性(例如字段)的类型将允许将Couchbase中的同一文档索引到Elasticsearch中的多个文档。这将意味着数据完整性的损失。
换句话说,Couchbase中文档的主键是id。 Elasticseach中文档的主键是_uid,它是通过将类型和ID组合为{type}#{id}
而创建的。我们希望它们匹配,这就是插件以它的方式强制执行的原因。
在旁注中,如果您的类型基于ID的前缀,则不应使用RegexTypeSelector
,而应使用DelimiterTypeSelector
。这样您只需指定分隔符(默认情况下为':#39;)它会将所有前缀映射到一个类型。保存您必须为每种类型定义单独的正则表达式。
couchbase.typeSelector: org.elasticsearch.transport.couchbase.capi.DelimiterTypeSelector
couchbase.typeSelector.documentTypeDelimiter: ':'