我使用spring数据solr来索引数据。当实体包含byte []类型的字段时,将数据插入solr时会出现异常。
异常:org.springframework.data.solr.UncategorizedSolrException:
错误:[doc = a1-t1]错误添加字段' =' [1,2,3,4,-1,2, 3,8]' msg =字符串长度必须是四的倍数。嵌套异常 是 org.apache.solr.client.solrj.impl.HttpSolrServer $ RemoteSolrException:
错误:[doc = a1-t1]错误添加字段' =' [1,2,3,4,-1,2, 3,8]' msg =字符串长度必须是四的倍数。 ([1,2 ......]是 只是测试数据。)
以下是有关我的代码的信息。 实体:
@IdClass(AttachedFileSolrPk.class)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@SolrDocument(solrCoreName = "attached_file")
public class AttachedFileSolr implements Serializable {
/**
* ID
*/
@Id
@Field
private String id;
// @ElementCollection(targetClass=byte.class)
@Field
@NotNull
private byte[] contents;
//other fields are omitted
}
存储库:
public interface AttachedFileSolrRepository extends SolrCrudRepository<AttachedFileSolr, AttachedFileSolrPk> {
//custom interface are omitted
}
呼叫存储库:
byte[] contents = {1, 2, 3, 4, -1, 2, 3, 8};
attachedFileSolr = AttachedFileSolr.builder().id("a1").contents(contents).build();
attachedFileSolrRepository.save(attachedFileSolr);
schema.xml中
<fieldType name="binary" class="solr.BinaryField"/>
<field name="contents" type="binary" multiValued="true" indexed="false" required="true" stored="true"/>
框架:spring boot,spring data solr starter
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
solr version:6.1.0
我的solr与其他类型如字符串,日期和布尔值一起使用效果很好,但这是我第一次使用二进制字段。我认为调整schema.xml和java实体很容易,但事实证明并非如此。我已经尝试了很多,例如将byte[]
更改为字节,将multiValued="true"
更改为false,或将indexed="false"
更改为false,依此类推,但始终出现相同的异常。
我感谢任何人的建议。谢谢!
答案 0 :(得分:-1)
使用 SolrJ。
添加文档:
InputStream inputStream;
byte[] bytes = org.apache.commons.io.IOUtils.toByteArray(inputStream);
byte[] encoded = java.util.Base64.getEncoder().encode(bytes);
SolrInputDocument solrDoc = new SolrInputDocument();
solrDoc.setField("binary", encoded); // binary solr field
// push doc to Solr
从 solr 检索文档时:
SolrDocument doc;
byte[] bytes = (byte[]) doc.getFieldValue("binary");
byte[] decoded = java.util.Base64.getDecoder().decode(bytes);