第三十六节 使用springdata,把数组属性存入ElasticSearch

亮子 2025-03-17 08:23:15 495 0 0 0

在使用 Spring Data Elasticsearch(Spring Data ES)时,如果想将一个包含数组的属性存储到 Elasticsearch 中,可以通过以下步骤实现:

  1. 定义实体类,使用 Spring Data Elasticsearch 提供的注解,确保数组类型属性正确映射到 Elasticsearch 中。

  2. 配置 Elasticsearch 存储:确保 Elasticsearch 的字段支持存储数组类型(Elasticsearch 本身是支持数组类型的,它会将数组字段存储为一个列表)。

  3. 使用 @Field 注解:对数组属性使用 @Field 注解指定字段的类型。

下面是一个使用 Spring Data Elasticsearch 存储数组属性的示例。

示例

假设我们有一个 User 实体类,其中包含一个数组类型的属性 tags,我们希望将它存储到 Elasticsearch 中。

1. 实体类定义

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.List;

@Document(indexName = "user")
public class User {

    @Id
    private String id;

    private String name;

    // 使用 @Field 注解指定字段类型为 Text 或 Keyword
    @Field(type = FieldType.Keyword)
    private List<String> tags;  // 数组类型,Elasticsearch 会自动处理

    // Getters 和 Setters
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<String> getTags() {
        return tags;
    }

    public void setTags(List<String> tags) {
        this.tags = tags;
    }
}

2. Elasticsearch 配置

通常,Spring Data Elasticsearch 会自动配置连接到本地或远程的 Elasticsearch 集群。如果你需要自定义 Elasticsearch 客户端配置,可以通过 @Configuration 类进行配置。

例如:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.Query;

@Configuration
public class ElasticsearchConfig {

    @Bean
    public ElasticsearchRestTemplate elasticsearchRestTemplate() {
        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("localhost:9200") // Elasticsearch 服务地址
                .build();

        return new ElasticsearchRestTemplate(clientConfiguration);
    }
}

3. Elasticsearch Repository

你需要定义一个 ElasticsearchRepository 来提供对 Elasticsearch 的 CRUD 操作。

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface UserRepository extends ElasticsearchRepository<User, String> {
}

4. 使用 Repository 保存数据

你可以通过 UserRepository 来保存 User 实体,包括其中的数组属性。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
public class UserService implements CommandLineRunner {

    @Autowired
    private UserRepository userRepository;

    @Override
    public void run(String... args) throws Exception {
        // 创建 User 对象
        User user = new User();
        user.setId("1");
        user.setName("John Doe");
        user.setTags(Arrays.asList("developer", "java", "spring"));

        // 保存到 Elasticsearch
        userRepository.save(user);

        // 查找保存的用户
        User retrievedUser = userRepository.findById("1").orElse(null);
        System.out.println("User Retrieved: " + retrievedUser.getName());
    }
}

5. Elasticsearch 中的数据

在 Elasticsearch 中,存储的数据会类似如下:

{
  "_index": "user",
  "_id": "1",
  "_source": {
    "name": "John Doe",
    "tags": ["developer", "java", "spring"]
  }
}

重要说明:

  • 字段类型tags 字段在 Elasticsearch 中会被存储为一个数组。Elasticsearch 会自动将这个数组的每个元素作为一个单独的值存储在同一个字段中。
  • 数组映射:Spring Data Elasticsearch 会自动处理数组类型(如 List<String>)到 Elasticsearch 中的映射,通常 Elasticsearch 会将其视为多值字段。
  • FieldType:在 @Field 注解中,我们使用了 FieldType.Keyword 来确保数组中的字符串被当作关键字存储。可以根据需要调整为其他类型,如 TextKeyword,或其他。

通过这种方式,你可以轻松地将数组类型的属性存储到 Elasticsearch 中。