本文共 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/