Spring Data Elasticsearch 基本语法及使用

  1. 使用idea创建一个SpringBoot demo工程
  2. 引入依赖
<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
  1. application.yml文件配置:
spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 192.168.x.x:9300
  1. 实体类
@Document(indexName = "items", shards = 1, replicas = 0)
public class Item {
    @Id
    private Long id;
    
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title; //标题
    
    @Field(type = FieldType.Keyword)
    private String category;// 分类
    
    @Field(type = FieldType.Keyword)
    private String brand; // 品牌
    
    @Field(type = FieldType.Double)
    private Double price; // 价格
    
    @Field(index = false, type = FieldType.Keyword)
    private String images; // 图片地址
}
  1. 测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class ElasticsearchTest {

    @Autowired
    private ElasticsearchRestTemplate restTemplate;

    @Autowired
    private ItemRepository itemRepository;



    @Test
    public void testCreatedIndex(){
        this.restTemplate.createIndex(Item.class);
        this.restTemplate.putMapping(Item.class);
        /*
            方法过时: 替代方法
              this.elasticsearchOperations.indexOps(Brand.class).createMapping(Brand.class);
         */
    }

    @Test
    public void testDeleteIndex(){
        this.restTemplate.deleteIndex("item");
    }

    @Test
    public void testSave(){
        Item item = new Item(1L, "小米手机7", " 手机",
                "小米", 3499.00, "http://image.leyou.com/13123.jpg");
        this.itemRepository.save(item);
    }

    @Test
    public void testSaveALl(){
        List<Item> list = new ArrayList<>();
        list.add(new Item(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.leyou.com/123.jpg"));
        list.add(new Item(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.leyou.com/3.jpg"));
        this.itemRepository.saveAll(list);
    }

    /**
     * id 一直,保存也是修改
     */
    @Test
    public void testUpdate(){
        Item item = new Item(1L, "小米手机8", " 手机",
                "小米", 3599.00, "http://image.leyou.com/13123.jpg");
        this.itemRepository.save(item);

    }

    @Test
    public void testDelete(){
//        this.itemRepository.deleteById(1L);
//        this.itemRepository.delete(new Item(1L));
        this.itemRepository.deleteAll();
    }


    @Test
    public void testQuery(){
//        Optional<Item> byId = this.itemRepository.findById(1L);
//        System.out.println(byId.get());

//        Iterable<Item> items = this.itemRepository.findAll();
//        items.forEach(System.out::println);

        Iterable<Item> items = this.itemRepository.findAll(Sort.by("price").descending());
        items.forEach(System.out::println);


    }

    @Test
    public void testQueryByTitle(){
//        List<Item> items = this.itemRepository.findByTitle("手机");
        List<Item> items = this.itemRepository.findByPriceBetween(3600d, 5000d);
        items.forEach(System.out::println);
    }

    @Test
    public void indexList() {
        List<Item> list = new ArrayList<>();
        list.add(new Item(1L, "小米手机7", "手机", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(2L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(3L, "华为META10", "手机", "华为", 4499.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(4L, "小米Mix2S", "手机", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(5L, "荣耀V10", "手机", "华为", 2799.00, "http://image.leyou.com/13123.jpg"));
        // 接收对象集合,实现批量新增
        this.itemRepository.saveAll(list);
    }

    @Test
    public void testSearch(){
        MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "手机");
        Iterable<Item> items = this.itemRepository.search(queryBuilder);
        items.forEach(System.out::println);

    }

    /**
     * 自定义查询
     */
    @Test
    public void testNative(){
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("title","手机"));
        Page<Item> items = this.itemRepository.search(nativeSearchQueryBuilder.build());
        items.forEach(System.out::println);

    }

    @Test
    public void testNativeByPages(){
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("category","手机"));
        // 分页
        nativeSearchQueryBuilder.withPageable(PageRequest.of(1,2));
        Page<Item> items = this.itemRepository.search(nativeSearchQueryBuilder.build());
        System.out.println(items.getTotalPages());
        System.out.println(items.getTotalElements());
        items.forEach(System.out::println);

    }

    @Test
    public void testNativeBySort(){
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("category","手机"));
        // 分页
//        nativeSearchQueryBuilder.withPageable(PageRequest.of(1,2));
        // 排序
        nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
        Page<Item> items = this.itemRepository.search(nativeSearchQueryBuilder.build());
        System.out.println(items.getTotalPages());
        System.out.println(items.getTotalElements());
        items.forEach(System.out::println);

    }

    @Test
    public void testAgg(){
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{},null));
        // 根据brand聚合
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("brand_agg").field("brand"));

        // 查询,需要把结果强转为AggregatedPage实现类类型
        AggregatedPageImpl<Item> itemPage = (AggregatedPageImpl<Item>)this.itemRepository.search(nativeSearchQueryBuilder.build());
        // 根据聚合名称解析
        ParsedStringTerms stringTerms = (ParsedStringTerms)itemPage.getAggregation("brand_agg");
        // 获取桶
        List<? extends Terms.Bucket> buckets = stringTerms.getBuckets();
        buckets.forEach(bucket -> {
            // 获取桶中的key,即品牌名称
            System.out.println(bucket.getKeyAsString());
            // 获取桶中的文档数量
            System.out.println(bucket.getDocCount());
        });

    }

    @Test
    public void testSubAgg(){
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        // 根据brand聚合,桶内价格求平均值
        nativeSearchQueryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{},null));
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("brand_agg").field("brand")
                .subAggregation(AggregationBuilders.avg("avg_price").field("price"))
        );

        // 查询,需要把结果强转为AggregatedPage实现类类型 不可用Aggregated
        AggregatedPageImpl<Item> itemPage = (AggregatedPageImpl<Item>)this.itemRepository.search(nativeSearchQueryBuilder.build());
        // 根据聚合名称解析 不可用StringTerms
        ParsedStringTerms stringTerms = (ParsedStringTerms)itemPage.getAggregation("brand_agg");
        // 获取桶
        List<? extends Terms.Bucket> buckets = stringTerms.getBuckets();
        buckets.forEach(bucket -> {
            // 获取桶中的key,即品牌名称
            System.out.println(bucket.getKeyAsString());
            // 获取桶中的文档数量
            System.out.println(bucket.getDocCount());
            // 获取桶内聚合  不可用InternalAvg
            ParsedAvg avgPrice = (ParsedAvg)bucket.getAggregations().asMap().get("avg_price");
            System.out.println(avgPrice.getValue());;
        });

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Data ElasticsearchSpring Data 家族的一员,为 Elasticsearch 提供了集成支持。通过 Spring Data Elasticsearch,我们可以使用更加简洁的方式来操作 Elasticsearch,并且可以与 Spring 的其他组件无缝集成。 下面是一个简单的 Spring Boot 应用程序,使用 Spring Data Elasticsearch 进行 Elasticsearch 操作的示例: 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. 配置 Elasticsearch 在 application.properties 文件中添加以下配置: ```properties spring.data.elasticsearch.cluster-nodes=localhost:9300 spring.data.elasticsearch.cluster-name=my-application ``` 3. 创建实体类 创建一个实体类,用于映射 Elasticsearch 中的文档: ```java @Document(indexName = "my_index", type = "my_type") public class MyEntity { @Id private String id; private String name; private Integer age; // getters and setters } ``` 4. 创建 Repository 创建一个 Repository 接口,继承自 ElasticsearchRepository: ```java public interface MyEntityRepository extends ElasticsearchRepository<MyEntity, String> { } ``` 5. 使用 Repository 进行操作 在 Service 或者 Controller 中注入 MyEntityRepository,并使用其提供的方法进行 Elasticsearch 操作: ```java @Service public class MyService { @Autowired private MyEntityRepository myEntityRepository; public void save(MyEntity entity) { myEntityRepository.save(entity); } public List<MyEntity> search(String keyword) { return myEntityRepository.findByNameLike(keyword); } } ``` 上面的代码演示了如何使用 MyEntityRepository 进行保存和搜索操作。Spring Data Elasticsearch 为我们提供了一些内置的方法,我们可以根据需要自定义方法。 以上就是 Spring Data Elasticsearch 的简单使用教程,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值