我有一个SOLR模式如下:
<field name="category_id1" type="integer" indexed="false" stored="true" />
<field name="category_id2" type="integer" indexed="false" stored="true" />
<field name="category_id3" type="integer" indexed="false" stored="true" />
<field name="category_ids" type="integer" multiValued="true" indexed="true" stored="true"/>
和复制部分:
<copyField source="category_id1" dest="category_ids" />
但是每当我尝试将数据注入DSE/Cassandra时,我都会收到此错误
InvalidRequestException(why:(Expected 4 or 0 byte int (14)) [diem][business][category_ids] failed validation)
me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:(Expected 4 or 0 byte int (14)) [diem][business][category_ids] failed validation)
Exception in thread "main" me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:(Expected 4 or 0 byte int (14)) [diem][business][category_ids] failed validation)
at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:45)
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:264)
at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:97)
at me.prettyprint.cassandra.model.MutatorImpl.execute(MutatorImpl.java:243)
at com.diem.db.crud.CassandraStorageManager.insertMultiColumns(CassandraStorageManager.java:197)
at com.diem.db.dao.impl.AbstractDaoImpl.saveUUIDEntity(AbstractDaoImpl.java:47)
at com.diem.db.dao.impl.BusinessDaoImpl.saveBusiness(BusinessDaoImpl.java:81)
at com.diem.data.LoadBusinesses.execute(LoadBusinesses.java:187)
at com.diem.data.LoadContent.run(LoadContent.java:121)
at com.diem.data.LoadBusinesses.main(LoadBusinesses.java:45)
Caused by: InvalidRequestException(why:(Expected 4 or 0 byte int (14)) [diem][business][category_ids] failed validation)
at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:20833)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:964)
at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:950)
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:246)
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:243)
at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:103)
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:258)
... 8 more
复制到多值 solr 中。IntField(整数(并不是什么特别的东西,我们可以在使用DSE/SOLR之前做到这一点。但我似乎无法在DSE/SOLR组合中获得这项工作。从逻辑上讲,我看不出这失败的任何原因,因为 DSE 不应该干扰category_ids
字段的操作,该字段主要用于索引。有人认为情况有什么问题吗?在这种情况下,我可以做些什么来防止验证错误(注意:我不能对category_ids
使用文本/字符串类型(?
谢谢!
我可以找出问题所在,我的 CF 有一个default_validation_class=BytesType
,因此使用 DSE/Solr 中的 BytesType 验证多值字段category_ids
,这将导致错误。因此,除非我使用 LIST<int>
类型将我的 CF 更改为 CQL 声明并且不使用 Hector(至少对于此 CF(,否则我将无法在 Solr 中使用除文本/字符串字段以外的多值字段。
如果我理解正确,您使用的是节俭表,因此您要么将category_ids列声明为 UTF8Type(Solr 字段可以是任何类型的(,要么将category_ids Solr 字段声明为 storage=false(在这种情况下,复制字段将不会存储,只会索引(。
让我们知道这两个中的任何一个是否适合您。