Spring Data ElasticSearch初步使用

作者: 岳峙 | 来源:发表于2019-03-29 17:36 被阅读97次

    spring data能够和所有的主流数据源进行整合
    首先在github中找到相关的开源项目

    https://github.com/spring-projects/spring-data-elasticsearch
    

    idea中新建maven工程
    在pom.xml中加入

    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.leyou.demo</groupId>
        <artifactId>es-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <name>elasticsearch</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <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-data-elasticsearch</artifactId>
            </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: 192.168.160.128:9300
    

    新建启动类
    EsApplication

    package com.leyou;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @Author: Pandy
     * @Date: 2019/3/29 16:32
     * @Version 1.0
     */
    @SpringBootApplication
    public class EsApplication {
        public static void main(String[] args) {
            SpringApplication.run(EsApplication.class);
        }
    }
    
    

    创建实体类es.pojo
    Items

    package com.leyou.es.pojo;
    
    import lombok.Data;
    
    @Data
    public class Item {
        Long id;
        String title; //标题
        String category;// 分类
        String brand; // 品牌
        Double price; // 价格
        String images; // 图片地址
    }
    

    以上的实体类一会还要加信息进行修改


    image.png
    package com.leyou.es.demo;
    
    import com.leyou.es.pojo.Item;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
    
    /**
     * @Author: Pandy
     * @Date: 2019/3/29 16:39
     * @Version 1.0
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class EsTest {
    
        //spring data 自己的测试模板
        @Autowired
        ElasticsearchTemplate template;
    
        /**
         * 实体类上创建索引的测试
         */
        @Test
        public void testCteate(){
            //创建索引库
            template.createIndex(Item.class);
            //映射关系
            template.putMapping(Item.class);
        }
    
    }
    
    

    修改实体类 加上创建索引的信息

    package com.leyou.es.pojo;
    
    import lombok.Data;
    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;
    
    @Data
    @Document(indexName = "test3",type = "item",shards = 1,replicas = 1)
    public class Item {
    
        @Field(type = FieldType.Long,index = true)
        @Id
        Long id;
    
        @Field(type = FieldType.Text,analyzer = "ik_smart",index = true)
        String title; //标题
    
        @Field(type = FieldType.Keyword,index = true)
        String category;// 分类
    
        @Field(type = FieldType.Keyword,index = true)
        String brand; // 品牌
    
        @Field(type = FieldType.Double,index = true)
        Double price; // 价格
    
        @Field(type = FieldType.Keyword,index = false)
        String images; // 图片地址
    }
    

    然后启动项目


    image.png

    在Kibana中进行测试 查询映射关系


    image.png

    template适合做原生的复杂查询 一般的增删改查使用一个接口即可

    package com.leyou.es.pojo.repository;
    
    import com.leyou.es.pojo.Item;
    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
    
    /**
     * @Author: Pandy
     * @Date: 2019/3/29 17:00
     * @Version 1.0
     */
    public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    }
    
    

    然后进行测试

    package com.leyou.es.demo;
    
    import com.leyou.es.pojo.Item;
    import com.leyou.es.pojo.repository.ItemRepository;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @Author: Pandy
     * @Date: 2019/3/29 16:39
     * @Version 1.0
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class EsTest {
    
        //spring data 自己的测试模板
        @Autowired
        ElasticsearchTemplate template;
    
        @Autowired
        private ItemRepository repository;
        /**
         * 实体类上创建索引的测试
         */
        @Test
        public void testCteate(){
            //创建索引库
            template.createIndex(Item.class);
            //映射关系
            template.putMapping(Item.class);
            //删除索引
            //template.deleteIndex(Item.class);
    
        }
    
        /**
         * template做原生的复杂查询
         * 一般的增删改查
         */
        @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"));
            repository.saveAll(list);
        }
    
    }
    
    

    注意在实体类上面加上注解
    全参构造以及空参构造


    image.png

    批量添加成功

    GET /test3/_search
    {
      "query": {"match_all": {
        
      }}
    }
    
    image.png

    测试查询

     @Test
        public void testFind(){
            Iterable<Item> all = repository.findAll();
            for (Item item : all) {
                System.out.println("item = " + item);
            }
        }
    

    控制台


    image.png

    框架帮我们在对象与json之间做转换

    进行复杂查询只需要在接口中定义方法即可~
    我们想进行价格的范围查询
    在接口中定义相应的方法

    package com.leyou.es.pojo.repository;
    
    import com.leyou.es.pojo.Item;
    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
    
    import java.util.List;
    
    /**
     * @Author: Pandy
     * @Date: 2019/3/29 17:00
     * @Version 1.0
     */
    public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
        //范围查询价格
        List<Item> findByPriceBetween(Double begin,Double end);
    }
    
    

    然后直接调用 传入参数即可返回结果

     @Test
        public void testComplexFind(){
            List<Item> items = repository.findByPriceBetween(2000d, 4000d);
            for (Item item : items) {
                System.out.println("item = " + item);
            }
        }
    

    截图


    image.png

    其实这是一自定义方法 springdata 可以根据方法名称自动实现功能 但是这个方法看似是凭逻辑随便写的 其实要符合一定的规范

    什么字段能被识别 其实可以在网上查 也可以使用idea的反射 进行提示性的输入

    相关文章

      网友评论

        本文标题:Spring Data ElasticSearch初步使用

        本文链接:https://www.haomeiwen.com/subject/rotrbqtx.html