记spring-data-elasticsearch API文档学习

记录spring-data-elasticsearch的API文档学习

一 开发环境

springboot 2.0.1 + docker +elasticsearch5.6.3

docker搭建ES服务器和kibana监控平台

二 创建springboot工程

依赖如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cy</groupId>
    <artifactId>spring-data-elasticsearch-kafka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-data-elasticsearch-kafka</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.yml
spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 127.0.0.1:9300

需要放开9200和9300两个端口
9300端口是使用tcp客户端连接使用的端口;
9200端口是通过http协议连接es使用的端口;
cluster-nodes是 {your.server.ip}:9300
cluster-name是访问localhost:9200里面的cluster_name 保持名字一样

三 准备实体类

@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; // 图片地址
}

index.name -> 创建的索引名字
type -> 对应在索引库中的类型
shards -> 节点上索引的分片数 (primary shards)
replicas -> 每个分片的副本 (replicas shards)
FieldType.Keyword -> 不分词
index = false 不作为索引条件 当对images进行索引 会抛出异常

四 持久层

@Repository
public interface ESRepository extends ElasticsearchRepository<Item,Long> {
}

五 业务逻辑层 — 索引创建与删除

    /**
     * 创建索引和创建字段映射
     */
    public void create_index() {
        elasticsearchTemplate.createIndex(Item.class);
        log.info("创建索引成功");
        elasticsearchTemplate.putMapping(Item.class);
        log.info("字段映射成功");
    }

    /**
     * 删除索引
     */
    public void delete_index() {
        //Clazz String
        elasticsearchTemplate.deleteIndex(Item.class);
//        elasticsearchTemplate.deleteIndex("item");
        log.info("删除索引成功");
    }

六 业务逻辑层— 数据的增删改

 /**
     * 新增
     */
    public void add() {
        Item item = esRepository.save(
                new Item(4L, "Iphone X", "手机", "小米",
                        6398.00, "http://image.baidu.com/13123.jpg")
        );
        log.info("添加数据:" + item.toString());
        //可迭代
        List<Item> list = new ArrayList<>();
        list.add(new Item(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.baidu.com/13123.jpg"));
        list.add(new Item(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.baidu.com/13123.jpg"));
        esRepository.saveAll(list);
        log.info("批量添加数据");
    }


    /**
     * 修改
     */
    public void update() {
        Item item = esRepository.save(
                new Item(1L, "Iphone X", "手机", "苹果",
                        6399.00, "http://image.baidu.com/13123.jpg")
        );
    }

    /**
     * 删除
     */
    public void delete() {
        esRepository.delete(
                new Item(1L, "Iphone X", "手机", "小米",
                        6399.00, "http://image.baidu.com/13123.jpg")
        );

//        esRepository.deleteById(1L);

    }

六 业务逻辑层— 数据的基本查询

/**
     * 分页查询
     *
     * @param page
     * @param size
     */
    public void search_paging(int page, int size) {
        Page<Item> items = esRepository.findAll(PageRequest.of(page, size));
        items.forEach(x -> log.info(x.toString()));
    }

    /**
     * 排序查询
     */
    public void search_sort() {
        Iterable<Item> items = esRepository.findAll(Sort.by("price").descending());
        items.forEach(x -> log.info(x.toString()));
    }

    /**
     * term query 
     */
    public void search_as_your_want() {
        //根据term query 再来进行分页查询 此方法默认查询第一页的前十条
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.termQuery("brand", "小米")).build();
        Page<Item> pages = esRepository.search(searchQuery);
        pages.stream().sorted(Comparator.comparing(Item::getPrice)).forEach(x -> log.info(x.toString()));
    }

    /**
     * match query  ES已经进行排序 其本质为term query
     */
    public void search_as_your_want2(){
        NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchQuery("title", "Iphone X")).build();

        Page<Item> pages = esRepository.search(query);
        pages.stream().sorted(Comparator.comparingDouble(Item::getPrice)).forEach(x->log.info(x.toString()));

    }

    /**
     * range query
     */
    public void search_as_your_want3(){
        NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.rangeQuery("price").gte(0).lte(10000)).build();

        Page<Item> pages = esRepository.search(query);
        pages.stream().sorted(Comparator.comparingDouble(Item::getPrice)).forEach(x->log.info(x.toString()));

    }

    /**
     * bool query
     */
    public void search_as_your_want4(){
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        BoolQueryBuilder boolQuery = boolQueryBuilder.filter(QueryBuilders.termQuery("brand", "小米"))
                .should(QueryBuilders.rangeQuery("price").gte(3000).lte(7000));

        Iterable<Item> items = esRepository.search(boolQuery);
        StreamSupport.stream(items.spliterator(),false)
                .sorted(Comparator.comparingDouble(Item::getPrice))
                .forEach(x->log.info(x.toString()));

    }

    /**
     *  sort query
     */
    public void search_as_your_want5(){

        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchQuery("brand", "小米"))
                .withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC)).build();
        Page<Item> items = esRepository.search(searchQuery);
        items.forEach(x->log.info(x.toString()));

    }

    /**
     * fuzzy query
     */
    public void search_as_your_want6(){
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.fuzzyQuery("brand", "小米")).build();
        Page<Item> items = esRepository.search(searchQuery);
        items.forEach(x->log.info(x.toString()));
    }

此只记录核心代码块

随后将会用springBoot整合kafka和elasticSearch,实现批量拉取日志以及批量更新到ES,以及完成有ES为搜索中间件到博客搜索系统.

发布了19 篇原创文章 · 获赞 6 · 访问量 1982

猜你喜欢

转载自blog.csdn.net/qq_42252844/article/details/104149736