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的反射 进行提示性的输入