ElasticSearch框架整合与使用
ElasticSearch框架整合与使用
以SpringBoot集成为例
ElasticSearch 是一种流行的企业级搜索引擎,是一个分布式,高性能、高可用、可伸缩的搜索和分析系统。
通俗点来说,它就是提供一个存储数据的地方,然后搜索起来很快,特别是联想搜索,也就是模糊查询这种。
该篇包含内容:
1.基于windows ,下载安装 ElasticSearch(可以理解为一直存取数据的平台);
2.创建Springboot,整合ElasticSearch,使用入门的一些简单操作(插入,查询数据等)。
进入正题,
ElasticSearch 我使用版本为: 7.8.0
Springboot 我使用版本为:2.2.13.RELEASE
记住版本非常重要
重申一遍版本非常重要!!!!
第一步
首先是ElasticSearch 7.8.0版本下载安装,
可以到官网自行下载,也可以点击链接下载
ElasticSearch 7.8.0 baidu网盘下载链接:
链接:https://pan.baidu.com/s/1XBPFOQ4-pE-oojvGY1vDkg
提取码:47is
下载完解压,然后进到bin目录,运行elasticsearch.bat 即可。
运行后:
第二步
开始创建springboot项目,
创建完后,记得把springboot版本改成2.X版本,这里我使用的是2.2.13 RELEASE
然后是在pom.xml文件加入需要用到的依赖包,
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
然后是application.yml 文件:
spring:data:elasticsearch:cluster-nodes: 127.0.0.1:9300
server:port: 8066
创建一个Blog.class 类,用于测试例子的数据的存取:
注意 这里的@Document(indexName = “testdata”, type = “blogs”)
indexName 索引名称,其实相当于咱们的数据库名称 ,必须为小写, 不然会报org.elasticsearch.indices.InvalidIndexNameException异常
而type:类型 ,其实相当于咱们的数据库表的名称
import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;/****/
@Data
@Document(indexName = "testdata", type = "blogs")
public class Blog {private Long id;private String masterName;private Integer articleNum;private Integer commentNum;private Integer thumbNum;private String description;}
接着创建一个DataTestController.class,写一些测试的接口:
import com.example.elastucsearchdemo.pojo.Blog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*****/
@RestController
public class DataTestController {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@GetMapping("/addTest")public String testElSearch() {//该list用于添加需要存入的数据List<IndexQuery> indexQueryList = new ArrayList<>();//模拟一些数据Blog blog = new Blog();blog.setId((long) new Random().nextInt(1500));blog.setMasterName("JCccc");blog.setArticleNum(10);blog.setCommentNum(29);blog.setThumbNum(100);blog.setDescription("分享不仅为了别人,也是为了自己");//把这个数据放入indexQueryListindexQueryList.add(new IndexQueryBuilder().withObject(blog).build());//循环模拟一些数据for (int i = 1; i <= 6; i++) {Blog blog2 = new Blog();blog2.setId((long) new Random().nextInt(1500));blog2.setMasterName("Test");blog2.setArticleNum(i*60);blog2.setCommentNum(i*16);blog2.setThumbNum(i*500);blog2.setDescription("测试添加"+i);indexQueryList.add(new IndexQueryBuilder().withObject(blog2).build());}elasticsearchTemplate.bulkIndex(indexQueryList);return "add success ";}
}
运行项目,调用一下这个插入数据的模拟接口:
添加完毕了,但是到底是否真的添加进去了呢? 接下来暂时使用 elasticsearchTemplate提供的查询方法来验证下
写个查询接口:
@GetMapping("/getTestData")public List<Blog> getTestData(){//精确查询SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchPhraseQuery("masterName", "JCccc")).build();List<Blog> list = elasticsearchTemplate.queryForList(searchQuery, Blog.class);return list;}
调用下接口看下,查询正常:
那么接下来我们来增加多一些数据,进行模糊查询
//该list用于添加需要存入的数据List<IndexQuery> indexQueryList = new ArrayList<>();//循环模拟一些数据for (int i = 1; i <= 3; i++) {Blog blog2 = new Blog();blog2.setId((long) new Random().nextInt(1500));blog2.setMasterName("Test"+i*2*3);blog2.setArticleNum(i*60);blog2.setCommentNum(i*16);blog2.setThumbNum(i*500);blog2.setDescription("测试添加"+i);indexQueryList.add(new IndexQueryBuilder().withObject(blog2).build());}elasticsearchTemplate.bulkIndex(indexQueryList);
然后在验证下这个模糊搜索:
@GetMapping("/queryTestData")public List<Blog> getTestData(){SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.wildcardQuery("masterName", ("*" + "Test" + "*").toLowerCase())).build();List<Blog> list = elasticsearchTemplate.queryForList(searchQuery, Blog.class);return list;}
再调用一下,就可以看到模糊查询出所有包含Test的数据了。
那么假设已经知道了id,单个数据查询又是如何操作呢?如下,单个根据id查询,
@GetMapping("/queryTestDataOne")public String queryTestDataOne(){GetQuery query = new GetQuery();query.setId("114");Blog blog = elasticsearchTemplate.queryForObject(query, Blog.class);return blog.toString();}
那么假如我们不知道主键id,我们只知道一些条件,例如想查询 点赞数 thumbNum =1000的 数据,
也就是单条件查询:
这时候我们需要实现自定义查询类ElasticsearchOptionSearchRepository.class
import com.example.elastucsearchdemo.pojo.Blog;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;/*****/
@Repository
public interface ElasticsearchOptionSearchRepository extends ElasticsearchRepository<Blog,String> {}
然后写个接口:
@Autowiredprivate ElasticsearchOptionSearchRepository elasticsearchOptionSearchRepository;//根据单条件查询@GetMapping("/queryTestDataCondition")public List queryTestDataCondition(){List<Blog> list = new ArrayList<>();TermQueryBuilder termQuery = new TermQueryBuilder("thumbNum", 1000);Iterable<Blog> iterable = elasticsearchOptionSearchRepository.search(termQuery);iterable.forEach(e -> list.add(e));return list;}
运行调用接口,查看情况,都查询出来了:
第三步
其实到此咱们对于springboot 整合 elasticsearch 已经基本掌握了, 但是光这么插入数据查询数据,还是比较空洞,不免初学者会感觉这跟存缓存差不多,不知道数据到底有没有真正存入。
所以,我们最后一步是,安装使用可视化客户端 ElasticHD 。
依旧,不需要继续在网上找安装包了,我这边提供给大家的windows版本 5.6.0 :
ElasticHD 5.6.0 baidu网盘下载链接:
https://pan.baidu.com/s/1pGPPB9IU6GtXuvaX-B5mdg
提取码: epgp
1.下载安装解压,如:
- 不要双击运行记住! 进入到解压的目录下,通过命令执行,如:
3.运行成功后,会直接弹出ElasticHD的可视化页面 ,如:
然后咱们可以查看到我们上面的测试插入的数据:
选择我们刚刚存入数据的index(类似数据库名):
点击搜索即可看到数据:
PS:整合部分为网上转载,为了方便快速集成进行练习。
进阶用法:多条件查询
多条件查询以ElasticSearch 中boolQueryBuilder的使用为例:
首先了解bool 查询的各个用法
Bool查询对应Lucene中的BooleanQuery,它由一个或者多个子句组成,每个子句都有特定的类型
◆ must
返回的文档必须满足must子句的条件,并且参与计算分值
◆ filter
返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值
◆ should
返回的文档可能满足should子句的条件.在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回.minimum_should_match参数定义了至少满足几个子句.
◆ must_not
返回的文档必须不满足定义的条件
如果一个查询既有filter又有should,那么至少包含一个should子句.
bool查询也支持禁用协同计分选项disable_coord.一般计算分值的因素取决于所有的查询条件.
bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值.
代码样例:
public void () throws IOException {SearchRequest searchRequest = new SearchRequest("item");// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(QueryBuilders.matchQuery("scompCode", "G0000001"));// 模糊查询boolQueryBuilder.filter(QueryBuilders.wildcardQuery("itemDesc", "手机"));// 范围查询 from:相当于闭区间; gt:相当于开区间(>) gte:相当于闭区间 (>=) lt:开区间(<) lte:闭区间 (<=)boolQueryBuilder.filter(QueryBuilders.rangeQuery("itemPrice").from(4500).to(8899));sourceBuilder.query(boolQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);logger.info("查询数据:{}", Arrays.toString(searchResponse.getHits().getHits()));
}
进行了上述简单介绍后,我们举出几个场景,结合场景需求进行更加深入的理解。
业务场景一:
用户想对专家信息进行查询,希望有这样两个搜索框,第一个搜索框可以在姓名、性别、公司中进行全局搜索,第二个搜索框希望在电话、职位、简介中进行全局搜索。
主要代码:
// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//搜索框一
//query.getData为搜索框输入的值,"name","sex","company"为索引的字段名boolQueryBuilder.should(QueryBuilders.multiMatchQuery(query.getData(),"name","sex","company" ));
//搜索框二
//query.getData2为搜索框输入的值,"phone","position","introduction"为索引的字段名boolQueryBuilder.should(QueryBuilders.multiMatchQuery(query.getData2(),"phone","position","introduction" ));sourceBuilder.query(boolQueryBuilder);request.source(sourceBuilder);System.out.println(request);SearchResponse response = client.search(request, RequestOptions.DEFAULT);
ElasticSearch框架整合与使用相关推荐
- ssh(Struts+spring+Hibernate)三大框架整合-简述
ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...
- springMVC和Shiro框架整合使用简单示例 【转】
为什么80%的码农都做不了架构师?>>> 一.目录结构 首先是目录结构如图: 二.pom.xml文件 <project xmlns="http://maven. ...
- SSH框架整合-慕课课程
SSH框架整合-慕课课程 学习时间:2018年12月3日 慕课链接:基于SSH实现员工管理系统之框架整合篇 内容:Struts2+Hibernate+Spring框架整合,分为Struts2整合Spr ...
- SSH框架整合(代码加文字解释)
一.创建数据库并设置编码. A) create database oa default character set utf8. 二.MyEclipse工程 A) 在Myeclipse里创建web工程, ...
- spring boot 学习(二)spring boot 框架整合 thymeleaf
spring boot 框架整合 thymeleaf spring boot 的官方文档中建议开发者使用模板引擎,避免使用 JSP.因为若一定要使用 JSP 将无法使用. 注意:本文主要参考学习了大神 ...
- java web的ssh框架_JavaWeb_(SSH论坛)_二、框架整合
基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块传送门 导入Jar包 导入 ...
- 三大框架整合教程(Spring+SpringMVC+MyBatis)
1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaB ...
- 【struts2+spring+hibernate】ssh框架整合开发
SSH框架整合 1 Struts2+Spring+Hibernate导包 Struts2导入jar包: * struts2/apps/struts2-blank.war/WEB-INF/lib/*.j ...
- ThinkPHP框架整合phpqrcode生成二维码DEMO
ThinkPHP框架发展到今天功能已经变得是非常强大了,但是ThinkPHP框架中没有二维码相关的库,因此我们可以通过整合phpqrcode来完成生成二维码的功能.想使用phpqrcode首先就要把p ...
最新文章
- RDKit | 将rdMolDraw2D和RDKit生成的结构图输出到Excel
- IDA Pro - 如何得到比较清楚的逆向伪代码
- 黑马 程序员——Java基础---流程控制
- c语言 在执行区域没有空格,C语言上机操作指导之TurboC.doc
- binder,hwbinder,vndbinder之间的关系
- python创建一个csv文件_python如何写入csv
- 【转】No Persistence provider for EntityManager问题
- SQL SERVER 数据库概括
- Linux系统(二)常用命令、进程管理
- Samba共享目录的多用户权限设置案例
- Microsoft Visio 2010简体中文版
- 实验第七节——用户chaincode相关操作
- C# 合并多个PDF
- **LPC1788加密与解密方法**
- 学习3DMAX的几点收获
- HTML5期末大作业:个人网站设计——简单响应式个人博客HTML模板(8页面) HTML+CSS+JavaScript...
- std::adjacent_find 用法
- 国外开放课程及一些国外大学的网址
- 占书明:电脑只能上扣扣QQ和微信,无法打开网页,解决办法!
- 微信小程序苹果IOS手机无法加载显示临时图片路径