使用Spring Data Solr处理byte []

时间:2016-07-20 08:26:47

标签: solr binary spring-data-solr

我使用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,依此类推,但始终出现相同的异常。 我感谢任何人的建议。谢谢!

1 个答案:

答案 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);