SpringBoot2.x之Elasticsearch的配置使用(2)

实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
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;

//         索引库名称              类型名            分片
@Document(indexName = "mineok3", type = "item", shards = 1)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Item {
    @Field(type = FieldType.Long)
    @Id
    Long id;
                                    // 分词     分词类型
    @Field(type = FieldType.Text/*, analyzer = "ik_smart"*/)
    String title;           // 标题

    @Field(type = FieldType.Keyword)
    String category;        // 分类

    @Field(type = FieldType.Keyword)
    String brand;           // 品牌

    @Field(type = FieldType.Double)
    Double price;           // 价格
                                        // 不适用该字段检索数据
    @Field(type = FieldType.Keyword, index = false)
    String images;          // 图片地址
    
}

Repository

public interface ItemRepository extends ElasticsearchRepository<Item,Integer>{

}

测试类

@SpringBootTest
class ItemTest {
    @Resource
    ElasticsearchTemplate elasticsearchTemplate;
    @Resource
    ItemRepository itemRepository;
}

创建索引库

 @Test
    public void createIndexs() {
        // 创建索引库
        // 索引库名字,类型,文档,字段
        elasticsearchTemplate.createIndex(Item.class);
        // 创建映射
        elasticsearchTemplate.putMapping(Item.class);
    }

在这里插入图片描述

存储数据

 @Test
    public void saveTest() {
        List<Item> list = new ArrayList<>();
        list.add(new Item(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.taobao.com/123.jpg"));
        list.add(new Item(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.taobao.com/3.jpg")); // 接收对象集合,实现批量新增    
        list.add(new Item(4L, "苹果手机", " 手机", "苹果", 9999.00, "http://image.taobao.com/123.jpg"));
        itemRepository.saveAll(list);
    }

在这里插入图片描述

查询数据

 @Test
    public void queryTest() {
        Iterable<Item> all = itemRepository.findAll();
        for (Item item : all) {
            System.out.println(item);
        }
    }

在这里插入图片描述

条件查询

Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Integer>{
	// 自定义条件查询语句
    public List<Item> findItemByPriceBetween(Double start,Double end);
}
 @Test
    public void queryBy() {
        List<Item> itemByPriceBetween = itemRepository.findItemByPriceBetween(1000D, 4000D);
        for (Item item : itemByPriceBetween) {
            System.out.println(item);
        }
    }

在这里插入图片描述

原生查询

@Test
    public void queryProperty() {
        // 按照标题中是否包含"手机"查询
        MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "手机");
        // 本地Search查询构建器(包装)
        NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
        // 增加过滤条件:只要title,price,排除的字段数组为空
        searchQueryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"title", "price"}, null));
        // 按照价格降序排序
        searchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
        // 分页
        searchQueryBuilder.withPageable(PageRequest.of(0, 2));
        // 创建附加条件的查询(包装)
        searchQueryBuilder.withQuery(queryBuilder);
        Iterable<Item> items = itemRepository.search(searchQueryBuilder.build());
        for (Item item : items) {
            System.out.println(item);
        }
        System.out.println("总条数:" + ((Page<Item>) items).getTotalElements());
        System.out.println("总页数:" + ((Page<Item>) items).getTotalPages());
    }

在这里插入图片描述

聚合查询

 @Test
    public void queryProperty2() {
        // 按照标题中是否包含"手机"查询
        MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "手机");
        // 本地Search查询构建器(包装)
        NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
        // 按品牌分组
        searchQueryBuilder.addAggregation(AggregationBuilders.terms("popularBrand").field("brand"));
        // 查询并返回聚合结果
        AggregatedPage<Item> items = elasticsearchTemplate.queryForPage(searchQueryBuilder.build(), Item.class);
        // 解析
        Aggregations aggregations = items.getAggregations();
        StringTerms popularBrand = aggregations.get("popularBrand");
        List<StringTerms.Bucket> buckets = popularBrand.getBuckets();
        // 遍历
        for (StringTerms.Bucket bucket : buckets) {
            System.out.println("品牌分组:" + bucket.getKeyAsString());
            System.out.println("该品牌分组下的商品数量:" + bucket.getDocCount());
        }
    }

在这里插入图片描述

GitHub:SpringBoot相关Demo

发布了67 篇原创文章 · 获赞 21 · 访问量 2692

猜你喜欢

转载自blog.csdn.net/qq_44779506/article/details/105000490