Spring Data Elasticsearch4.3.x下的索引和文档操作

顾穆冉
2023-12-01

Spring Data框架集成es

Spring Data是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。

Spring Data Elasticsearch提供了与Elasticsearch搜索引擎的集成,Spring Data Elasticsearch的核心是以一个实体类为中心的模型,用于实现与es的交互。

注意:Spring Data尚未集成8.x版本的Elasticsearch,在使用Spring Data Elasticsearch4.3.x版本时,要使用7.15.2版本的Elasticsearch。

Elasticsearch7.15.2下载地址:es7.5.12官网下载地址

版本对应关系表

Spring Data Release TrainSpring Data ElasticsearchElasticsearchSpring FrameworkSpring Boot
2021.1(Q)4.3.x7.15.25.3.x2.5.x
2021.0(Pascal)4.2.x7.12.05.3.x2.5.x
2020.0(Ockham)4.1.x7.9.35.3.22.4.x
Neumann4.0.x7.6.25.2.122.3.x

新建SpringBoot项目

  • 引入依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • 创建package
   ├src
   ├─main
   │ ├─java
   │ │ └─com
   │ │   └─demo
   │ │     ├─config
   │ │     ├─dao
   │ │     └─domain
   │ └─resources
   │ ├─static
   │ └─templates
   └─test
     └─java
       └─com
         └─demo
  • 创建核心配置文件
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {

        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();

        return RestClients.create(clientConfiguration).rest();
    }
}
  • 创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(indexName = "product")
public class Product {
    @Id
    private Long id;

    @Field(type = FieldType.Text)
    private String name;

    @Field(type = FieldType.Double)
    private Double price;

    // Keyword表示不使用分词
    @Field(type = FieldType.Keyword)
    private String category;
}
  • 编写数据层接口

目的是继承官方封装好的一些方法,在使用时从Spring容器中直接拿出来bean对象调用父类方法。

@Repository
public interface ProductDao extends ElasticsearchRepository<Product, Long> {

}

索引操作

@SpringBootTest
class EsSpringbootDemoApplicationTests {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Test
    public void createIndex() {
        // 系统初始化会自动扫描实体类中的@Document注解创建索引
        System.out.println("索引创建成功");
    }

    @Test
    public void existsIndex() {
        // 因为初始化时就会自动创建索引,所以返回值永远为true
        boolean flag = elasticsearchRestTemplate.indexOps(IndexCoordinates.of("product")).exists();
        System.out.println("flag = " + flag);
    }

    @Test
    public void deleteIndex() {
        // 删除之后可使用Kibana查看索引情况
        boolean flag = elasticsearchRestTemplate.indexOps(IndexCoordinates.of("product")).delete();
        System.out.println("flag = " + flag);
    }
}

文档操作

@SpringBootTest
class EsSpringbootDemoApplicationTests {

    @Autowired
    private ProductDao productDao;

    @Test
    public void save() {
        // 新增文档数据
        Product product = new Product(1001L, "小米11", 4999.00, "手机");
        productDao.save(product);
    }

    @Test
    public void saveAll() {
        // 批量插入
        List<Product> list = new ArrayList<>();
        for (int i = 1; i < 10; i++) {
            Product product = new Product();
            product.setId(Long.valueOf(i));
            product.setName("小米" + i);
            product.setPrice(999.00 + i * 100);
            product.setCategory("手机");
            list.add(product);
        }
        productDao.saveAll(list);
    }

    @Test
    public void modify() {
        // 修改文档数据,id相同
        Product product = new Product(1001L, "小米12", 6999.00, "手机");
        productDao.save(product);
    }

    @Test
    public void findById() {
        // 根据id查询,需要传入一个Long类型的参数
        Product product = productDao.findById(1001L).get();
        System.out.println("product = " + product);
    }

    @Test
    public void findAll() {
        // 查询所有
        Iterable<Product> all = productDao.findAll();
        all.forEach(f -> System.out.println(f));
    }

    @Test
    public void findByPageable() {
        // 分页查询
        int page = 0;
        int size = 5;
        PageRequest pageRequest = PageRequest.of(page, size);
        productDao.findAll(pageRequest).forEach(f -> System.out.println(f));
    }

    @Test
    public void delete() {
        // 删除数据
        Product product = new Product();
        product.setId(1001L);
        productDao.delete(product);
    }

    @Test
    public void deleteById() {
        // 根据id删除数据
        productDao.deleteById(1001L);
    }
}
 类似资料: