SpringBoot整合Spring Data Elasticsearch的过程详解

网友投稿 279 2022-12-27


SpringBoot整合Spring Data Elasticsearch的过程详解

Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射

elasticsearch本质也是存储数据,它不支持事物,但是它的速度远比数据库快得多,

可以这样来对比elasticsearch和数据库

索引(indices)--------数据库(databases)

类型(type)------------数据表(table)

文档(Document)---------------- 行(row)

字段(Field)-------------------列(Columns )

整合:

1,在SprinBoot工程中引入jar包

org.springframework.bZIFiBoot

spring-boot-starter-data-elasticsearch

2,配置文件

spring.data.elasticsearch.cluster-name=elasticsearch //名字必须和elasticsearch.yml里面的cluster.name相同

spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

spring.data.elasticsearch.repositories.enabled=true

3,创建实体,并对类和属性进行标注

@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)//标记为文档类型,ndexName:对应索引库名称type:对应在索引库中的类型,shards:分片数量,默认5,replicas:副本数量,默认1

public class Item {

@Id //主键

private Long id;

@Field(type = FieldType.Text, analyzer = "ik_max_word") //标记为成员变量  FieldType,可以是text、long、short、date、integer等  text:存储数据时候,会自动分词,并生成索引  keyword:存储数据时候,不会分词建立索引  analyzer:分词器名称

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)//index:是否索引

private String images; // 图片地址

4.引入模板ElasticsearchTemplate

@Autowired

private ElasticsearchTemplate elasticsearchTemplate;

5.创建一个索引

//添加索引

@Test

public void addIndex() {

elasticsearchTemplate.createIndex(Item.class);

}

6.删除索引

//删除索引

@Test

public void delete(){

elasticsearchTemplate.deleteIndex("item");

}

7.新增对象

继承Repository提供的一些子接口,就能具备各种基本的CRUD功能,这里继承ElasticsearchCrudRepository

首先定义一个对象的接口

public interface ItemRepository extends ElasticsearchCrudRepository {

}

然后注入ItemRepository

@Autowired

private ItemRepository itemRepository;

新增对象

//新增一个对象

@Test

public void insert(){

Item item = new Item(2L,"坚果R1","手机","锤子",2500.00,"http://image.baidu.com/13123.jpg");

//Order order = new Order(20180020,"菜单");

itemRepository.save(item);

}

批量新增

//批量新增

@Test

public void insertList(){

List list = new LinkedList<>();

list.add(new Item(9L,"华为p20","手机","华为",3500.00,"http://image.baidu.com/13123.jpg"));

list.add(new Item(10L,"华为p30","手机","华为",5450.00,"http://image.baidu.com/13123.jpg"));

list.add(new Item(11L,"华为p30 pro","手机","华为",6980.00,"http://image.baidu.com/13123.jpg"));

itemRepository.saveAll(list);

}

8.查询

//根据字段查询所有

@Test

public void queryAll(){

//升序,相应降序为dscending

Iterable items = this.itemRepository.findAll(Sort.by("price").ascending());

for (Item item : items){

System.out.println(item);

}

}

9.自定义查询方法

Spring Data 的另一个强大功能,是根据方法名称自动实现功能,你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。当然,方法名称要符合一定的约定:

上图是截取csdn上博主我要取一个响亮的昵称的图

根据手机名查找手机

//自定义方法,根据Title查询

@Test

public void findByTitle(){

Item item = this.itemRepository.findByTitle("坚果pro");

System.out.println(item);

}

区间查询

//根据区间查询

@Test

public void queryByPriceBetween(){

List list = this.itemRepository.findByPriceBetween(2000.00, 3500.00);

for (Item item : list) {

System.out.println("item = " + item);

}

}

模糊查询

//模糊查询

@Test

public void queryLikeTitle(){

List list = this.itemRepository.findByTitleLike("R2");

for (Item item : list){

System.out.println(item);

}

}

使用自定义方法需要在接口里面申明方法

public interface ItemRepository extends ElasticsearchCrudRepository {

Item findByTitle(String title);

List findByPriceBetween(double price1, double price2);

List findByTitleLike(String title);

}

10.自定义查询

//自定义查询,查询数目等

@Test

public void matchQuery(){

// 构建查询条件

NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

// 添加基本分词查询

queryBuilder.withQuery(QueryBuilders.matchQuery("title","坚果"));

//获取结果

Page items = (Page) this.itemRepository.findAll();

//条数

long total = items.getTotalElements();

System.out.println("total = "+total);

for (Item item : items){

System.out.println(item);

}

}关键的是NativeSearchQueryBuilder这个类

分页查询

//分页查询

@Test

public void queryByPage(){

NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();

nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("category","手机"));

int page = 0;

int size = 2;

nativeSearchQueryBuilder.withPageable(PageRequest.of(page,size));

Page items = (Page) this.itemRepository.findAll();

long total = items.getTotalElements();

int totalPage = items.getTotalPages();

int nowPage = items.getNumber();

int pageSize = items.getSize();

System.out.println("总条数 = "+total);

System.out.println("总页数 = "+totalPage);

System.out.println("当前页 = "+nowPage);

System.out.println("每页大小 = "+pageSize);

for (Item item : items){

System.out.println(item);

}

}

还有很多,就不意义列举

在elasticsearch-head上查看数据

关于安装elasticsearch-head,参考地址

Spring Data Elasticsearch文档:https://docs.spring.io/spring-ZIFiBdata/elasticsearch/docs/3.1.10.RELEASE/reference/html/


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:游戏测试 接口测试工具(游戏测试常用工具)
下一篇:Java线程组操作实例分析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~