本文共 5377 字,大约阅读时间需要 17 分钟。
Spring Data Elasticsearch 是 Spring Data 项目的一个重要模块,旨在为 Elasticsearch 提供一套与 Spring 框架无缝集成的解决方案。它简化了与 Elasticsearch 的交互,提升了开发效率,同时保留了 Elasticsearch 的灵活性和强大功能。
在 pom.xml 中添加必要的依赖:
org.springframework.boot spring-boot-starter-data-elasticsearch
在 application.yml 中配置 Elasticsearch 连接信息:
spring: data: elasticsearch: cluster-name: elasticsearch cluster-nodes: 192.168.56.101:9300
定义一个简单的 Item
实体类,并添加必要的注解:
@Entity@Document(indexName = "item", type = "docs", 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;}
@Document
:标记实体类为 Elasticsearch 文档对象,配置索引名称、类型等属性。@Id
:标记字段为主键。@Field
:定义字段的映射属性,包括字段类型、索引设置等。使用 ElasticsearchTemplate
创建索引并自动映射实体类:
@RunWith(SpringRunner.class)@SpringBootTest(classes = ItcastElasticsearchApplication.class)public class IndexTest { @Autowired private ElasticsearchTemplate elasticsearchTemplate; @Test public void testCreate() { elasticsearchTemplate.createIndex(Item.class); elasticsearchTemplate.putMapping(Item.class); }}
@Testpublic void deleteIndex() { elasticsearchTemplate.deleteIndex("heima");}
定义一个接口,继承 ElasticsearchRepository
:
public interface ItemRepository extends ElasticsearchRepository- {}
@Autowiredprivate ItemRepository itemRepository;@Testpublic void index() { Item item = new Item(1L, "小米手机7", "手机", "小米", 3499.00, "http://image.leyou.com/13123.jpg"); itemRepository.save(item);}
@Testpublic void indexList() { List- list = new ArrayList<>(); 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/3.jpg")); itemRepository.saveAll(list);}
@Testpublic void testFind() { Iterable- items = itemRepository.findAll(Sort.by(Sort.Direction.DESC, "price")); items.forEach(item -> System.out.println(item));}
@Testpublic void testSort() { Page- items = itemRepository.search( new NativeSearchQueryBuilder() .withQuery(QueryBuilders.termQuery("category", "手机")) .withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC)) .build() ); items.forEach(System.out::println);}
@Testpublic void testNativeQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); queryBuilder.withQuery(QueryBuilders.matchQuery("title", "小米")); Page- items = itemRepository.search(queryBuilder.build()); System.out.println(items.getTotalElements()); items.forEach(System.out::println);}
@Testpublic void testPageQuery() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); queryBuilder.withPageable(PageRequest.of(0, 3)); queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机")); Page- items = itemRepository.search(queryBuilder.build()); System.out.println(items.getTotalElements()); System.out.println(items.getTotalPages()); items.forEach(System.out::println);}
@Testpublic void testAgg() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null)); queryBuilder.addAggregation( AggregationBuilders.terms("brands").field("brand") ); AggregatedPage- aggPage = itemRepository.search(queryBuilder.build()); StringTerms agg = (StringTerms) aggPage.getAggregation("brands"); List
buckets = agg.getBuckets(); for (StringTerms.Bucket bucket : buckets) { System.out.println(bucket.getKeyAsString() + ",共" + bucket.getDocCount() + "台"); }}
@Testpublic void testSubAgg() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null)); queryBuilder.addAggregation( AggregationBuilders.terms("brands").field("brand") .subAggregation(AggregationBuilders.avg("priceAvg").field("price")) ); AggregatedPage- aggPage = itemRepository.search(queryBuilder.build()); StringTerms agg = (StringTerms) aggPage.getAggregation("brands"); List
buckets = agg.getBuckets(); for (StringTerms.Bucket bucket : buckets) { System.out.println(bucket.getKeyAsString() + ",共" + bucket.getDocCount() + "台"); InternalAvg avg = (InternalAvg) bucket.getAggregations().asMap().get("priceAvg"); System.out.println("平均售价:" + avg.getValue()); }}
以上内容涵盖了 Spring Data Elasticsearch 的核心功能,包括索引操作、文档存储与查询、聚合等高级功能,适合开发者快速入门和实际应用。
转载地址:http://mnxbz.baihongyu.com/