Spring cloud机器学习企业级应用系统(J2EE)开发技术

Spring Data ElasticSearch初步使用

2019-03-29  本文已影响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的反射 进行提示性的输入

上一篇 下一篇

猜你喜欢

热点阅读