Elasticsearch学习(3) spring boot整合Elasticsearch的原生方式

前面我们已经介绍了spring boot整合Elasticsearch的jpa方式,这种方式虽然简便,但是依旧无法解决我们较为复杂的业务,所以原生的实现方式学习能够解决这些问题,而原生的学习方式也是Elasticsearch聚合操作的一个基础。

一、修改spring boot 的application.properties配置文件

1##端口号 2server.port=8880 3##es地址 4spring.data.elasticsearch.cluster-nodes =127.0.0.1:9300

需要注意的是:如果你的项目中只配置了Elasticsearch的依赖或者是其他nosql的依赖,那么就要在spring boot启动类中添加@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})注解,这个操作是关闭自动配置数据源文件信息。

二、创建一个Bean层

和spring boot的jpa方式一样,我们需要创建一个bean来作为我们的索引,注意indexName和type的值是你需要查找的索引内容。

1import org.springframework.data.elasticsearch.annotations.Document; 2 3@Document(indexName = "article",type = "center") 4public class Zoo { 5 private int id; 6 private String animal; 7 private Integer num; 8 private String breeder; 9 public int getId() { 10 return id; 11 } 12 public void setId(int id) { 13 this.id = id; 14 } 15 public String getAnimal() { 16 return animal; 17 } 18 public void setAnimal(String animal) { 19 this.animal = animal; 20 } 21 public Integer getNum() { 22 return num; 23 } 24 public void setNum(Integer num) { 25 this.num = num; 26 } 27 public String getBreeder() { 28 return breeder; 29 } 30 public void setBreeder(String breeder) { 31 this.breeder = breeder; 32 } 33 public Zoo(int id, String animal, Integer num, String breeder) { 34 super(); 35 this.id = id; 36 this.animal = animal; 37 this.num = num; 38 this.breeder = breeder; 39 } 40 public Zoo() { 41 super(); 42 } 43 44}

bean层代码

三、创建一个dao层

创建的dao层中不需要我们写实现的方法,只需要继承ElasticsearchRepository接口。

1import org.springframework.context.annotation.Configuration; 2import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; 3 4 5@Configuration 6public interface ZooMapper extends ElasticsearchRepository<Zoo,Integer>{ 7 8}

dao层代码

四、创建一个Controller层,编写原生代码

一般来说这个操作规范下应该写到service层,由于是测试项目,我就直接写在了controller中,我们直接看一个例子

1import java.util.List; 2 3import org.elasticsearch.index.query.BoolQueryBuilder; 4import org.elasticsearch.index.query.QueryBuilder; 5import org.elasticsearch.index.query.QueryBuilders; 6import org.elasticsearch.search.sort.FieldSortBuilder; 7import org.elasticsearch.search.sort.SortBuilders; 8import org.elasticsearch.search.sort.SortOrder; 9import org.springframework.beans.factory.annotation.Autowired; 10import org.springframework.data.domain.Page; 11import org.springframework.data.domain.PageRequest; 12import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; 13import org.springframework.data.elasticsearch.core.query.SearchQuery; 14import org.springframework.web.bind.annotation.GetMapping; 15import org.springframework.web.bind.annotation.RestController; 16 17 18@RestController 19public class UserController { 20 21 @Autowired 22 ZooMapper zooMapper; 23 24 // 访问接口地址:localhost:8880/find 25 //存储数据 26 @GetMapping("find") 27 public Object save(){ 28 29 //1.创建QueryBuilder 可以理解为装查询条件的容器 30 BoolQueryBuilder builder = QueryBuilders.boolQuery(); 31 //2.设置查询条件,参数1: 字段名 参数2:字段值(为什么中文是一个字而不是词,这个后面在说) 32 QueryBuilder queryBuilder1=QueryBuilders.termQuery("breeder", "饲"); 33 //设置查询条件多个匹配,参数1: 字段名 参数2:字段值 参数3:字段值 34 QueryBuilder queryBuilder2=QueryBuilders.termsQuery("animal", "rabbit","lion"); 35 36 37 //3.将查询的条件放入容器中 38 //其中 must相当于SQL中的and should相当于SQL中的or mustNot相当于SQL中的not 39 builder.must(queryBuilder1); 40 builder.should(queryBuilder2); 41 42 43 //4.设置排序 参数:需要排序字段 DESC表示降序 44 FieldSortBuilder sort = SortBuilders.fieldSort("id").order(SortOrder.DESC); 45 46 //5.设置分页,参数1:第几页开始(第一页是0),参数2:显示的条数 47 //在spring 2.0开始后,使用PageRequest.of创建分页参数 48 PageRequest page =PageRequest.of(0, 2); 49 50 51 //6.在设置好查询条件、排序设置、分页设置后需要将他们放入NativeSearchQueryBuilder 容器中 52 NativeSearchQueryBuilder nativeSearchQueryBuilder =new NativeSearchQueryBuilder(); 53 //将查询条件放入容器中 54 nativeSearchQueryBuilder.withQuery(builder); 55 //将分页放入容器中 56 nativeSearchQueryBuilder.withPageable(page); 57 //将排序放入容器中 58 nativeSearchQueryBuilder.withSort(sort); 59 //最后将容器组装后,生产NativeSearchQuery 60 //此时 SearchQuery中的sql为 61 //select * from zoo where breeder="饲养员1号" or animal in("rabbit","lion") ORDER BY id DESC LIMIT 0,2 62 SearchQuery query = nativeSearchQueryBuilder.build(); 63 System.out.println("查询的语句:" + query.getQuery().toString()); 64 //7.开始查询 65 Page<Zoo> listPage = zooMapper.search(query); 66 //获取总条数 67 int total = (int) listPage.getTotalElements(); 68 //获取查询的内容 69 List<Zoo> relist = listPage.getContent(); 70 System.out.println("relist----------------"+relist.toString()); 71 return relist; 72 } 73 74 75}

controller层代码

 在测试之前,我们需要在Elasticsearch中添加一个索引,这个索引和我们刚才创建的bean中配置的indexName和type的值一致。

 打开 http://localhost:8888/find,测试我们的代码:

  这样做原生的实现方式就已经成功了,接下来就将具体介绍代码中的具体步骤

六、查询条件的具体步骤

这一节主要讲解查询条件的具体功能,在controller中,有这样一段代码:

1//2.设置查询条件,参数1: 字段名 参数2:字段值(为什么中文是一个字而不是词,这个后面在说) 2 QueryBuilder queryBuilder1=QueryBuilders.termQuery("breeder", "饲"); 3 //设置查询条件多个匹配,参数1: 字段名 参数2:字段值 参数3:字段值 4 QueryBuilder queryBuilder2=QueryBuilders.termsQuery("animal", "rabbit","lion");

在这个步骤我们可以看到breeder的值是中文且中文是一个字而不是词,这是因为没有使用分词器的原因,Elasticsearch默认的分片是将中文分解成一个字,英文是单个单词:

1 设置查询条件

1//不分词查询 参数1: 字段名,参数2:字段查询值,因为不分词,所以汉字只能查询一个字,英语是一个单词. 2 QueryBuilder queryBuilder=QueryBuilders.termQuery("breeder", "饲"); 3//分词查询,采用默认的分词器 4 QueryBuilder queryBuilder2 = QueryBuilders.matchQuery("breeder", "饲养"); 5//多个匹配的不分词查询 6 QueryBuilder queryBuilder=QueryBuilders.termsQuery("animal", "rabbit","lion"); 7//多个匹配的分词查询 8 QueryBuilder queryBuilder= QueryBuilders.multiMatchQuery("animal", "r", "l"); 9//匹配所有文件,相当于就没有设置查询条件 10 QueryBuilder queryBuilder=QueryBuilders.matchAllQuery();

 2模糊查询

除了设置普通的查询,elasticsearch还为我们封装了模糊查询

1//1.常用的字符串查询 2 //相当于sql中的 breeder like "饲" 3 QueryBuilders.queryStringQuery("饲").field("breeder"); 4 //2.推荐与该文档相识的文档 5 //参数1:字段名 参数2:文档内容 6 //如果不指定第一个参数,则默认全部,这个是主要用来推荐偏好内容 7 QueryBuilders.moreLikeThisQuery(new String[] {"animal"}).addLikeText("rabbit"); 8 //3.分词的字段片查询,比如饲养员1号能够被中文分词器分为:饲养员 1 号 9 //使用下面的方法就能查询‘饲养员’这个片段,如果没有配置分词器,就查询全部 10 QueryBuilders.prefixQuery("breeder","饲养员 "); 11 //4.通配符查询,支持* 任意字符串;?任意一个字符与sql中的? *类似 12 //参数1:字段名 参数2字段值 13 QueryBuilders.wildcardQuery("animal","r??b*");

  在第二条偏好文档设置中有一个偏好的权重问题,如果感兴趣可以参考这个博客:https://blog.csdn.net/laigood/article/details/7831713

3 逻辑查询

1 //闭区间 相当于id>=2 and id<=5 2 QueryBuilder queryBuilder0 = QueryBuilders.rangeQuery("id").from("2").to("5"); 3 //开区间 相当于id>2 and id<5 4 //至于后面两个参数的值默认为true也就是闭区间 5 //如果想半开半闭只需要调整后面两个参数的值即可 6 QueryBuilder queryBuilder1 = QueryBuilders.rangeQuery("id").from("2").to("5").includeUpper(false).includeLower(false); 7 //大于 id>2 8 QueryBuilder queryBuilder2 = QueryBuilders.rangeQuery("id").gt("2"); 9 //大于等于 id>=2 10 QueryBuilder queryBuilder3 = QueryBuilders.rangeQuery("id").gte("2"); 11 //小于 id <5 12 QueryBuilder queryBuilder4 = QueryBuilders.rangeQuery("id").lt("5"); 13 //小于等于 id <=5 14 QueryBuilder queryBuilder5 = QueryBuilders.rangeQuery("id").lte("5");

以上就是spring boot整合Elasticsearch的原生方式所有实现方式,这个方式主要是后面的聚合查询的基础。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

​一篇文章总结一下Python库中关于时间的常见操作

前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在

Python将字符串转换成ObjectId类型

MongoDB自动生成的_id是ObjectId类型的。我需要将MongoDB的_id存到ElasticSearch中,而ElasticSearch又只能存String类型的_id,所以就涉及到两种类型的转换。ObjectId类型—→String类型这个非常简单

Spring Boot & ES 实战,值得参考!

作者:废物大师兄cnblogs.com/cjsblog/p/9756978.html1\.前言1.1.集成方式SpringBoot中集成Elasticsearch有4种方式:RESTClientJestSpringDataSpringD