используйте Spring Data Solr для работы с двоичным полем типа byte[]

Я использую spring data solr для индексации данных. Когда сущность содержит поле типа byte[], возникает исключение при вставке данных в solr.

Исключение: org.springframework.data.solr.UncategorizedSolrException:

ОШИБКА: [doc=a1-t1] Ошибка добавления поля 'contents'='[1, 2, 3, 4, -1, 2, 3, 8]' msg=Длина строки должна быть кратна четырем.; вложенным исключением является org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException:

ОШИБКА: [doc=a1-t1] Ошибка добавления поля 'contents'='[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);

схема.xml

<fieldType name="binary" class="solr.BinaryField"/>
<field name="contents" type="binary" multiValued="true" indexed="false" required="true" stored="true"/>

framework: 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>

Солер версия: 6.1.0

Мой solr хорошо работает с другими типами, такими как строка, дата и логическое значение, но я впервые использую двоичное поле. Я думаю, что просто настроить schema.xml и java-сущность, но это не так. Я много перепробовал, например, изменил byte[] на byte и multiValued="true" на false, или indexed="false" на false и так далее, но всегда получалось одно и то же исключение. Я ценю любые советы от кого бы то ни было. Спасибо!


person Yorick    schedule 20.07.2016    source источник


Ответы (1)


Использование SolJ.

Чтобы добавить документ:

    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);
person GrosMelon    schedule 09.03.2021
comment
Пожалуйста, включите свой собственный опыт / свой собственный код. Ссылаться на другие сайты и не давать ответ самостоятельно — это низкое качество. - person Dominik; 09.03.2021