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.下载安装解压,如:

  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框架整合与使用相关推荐

  1. ssh(Struts+spring+Hibernate)三大框架整合-简述

    ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...

  2. springMVC和Shiro框架整合使用简单示例 【转】

    为什么80%的码农都做不了架构师?>>>    一.目录结构 首先是目录结构如图: 二.pom.xml文件 <project xmlns="http://maven. ...

  3. SSH框架整合-慕课课程

    SSH框架整合-慕课课程 学习时间:2018年12月3日 慕课链接:基于SSH实现员工管理系统之框架整合篇 内容:Struts2+Hibernate+Spring框架整合,分为Struts2整合Spr ...

  4. SSH框架整合(代码加文字解释)

    一.创建数据库并设置编码. A) create database oa default character set utf8. 二.MyEclipse工程 A) 在Myeclipse里创建web工程, ...

  5. spring boot 学习(二)spring boot 框架整合 thymeleaf

    spring boot 框架整合 thymeleaf spring boot 的官方文档中建议开发者使用模板引擎,避免使用 JSP.因为若一定要使用 JSP 将无法使用. 注意:本文主要参考学习了大神 ...

  6. java web的ssh框架_JavaWeb_(SSH论坛)_二、框架整合

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块传送门 导入Jar包 导入 ...

  7. 三大框架整合教程(Spring+SpringMVC+MyBatis)

    1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaB ...

  8. 【struts2+spring+hibernate】ssh框架整合开发

    SSH框架整合 1 Struts2+Spring+Hibernate导包 Struts2导入jar包: * struts2/apps/struts2-blank.war/WEB-INF/lib/*.j ...

  9. ThinkPHP框架整合phpqrcode生成二维码DEMO

    ThinkPHP框架发展到今天功能已经变得是非常强大了,但是ThinkPHP框架中没有二维码相关的库,因此我们可以通过整合phpqrcode来完成生成二维码的功能.想使用phpqrcode首先就要把p ...

最新文章

  1. RDKit | 将rdMolDraw2D和RDKit生成的结构图输出到Excel
  2. IDA Pro - 如何得到比较清楚的逆向伪代码
  3. 黑马 程序员——Java基础---流程控制
  4. c语言 在执行区域没有空格,C语言上机操作指导之TurboC.doc
  5. binder,hwbinder,vndbinder之间的关系
  6. python创建一个csv文件_python如何写入csv
  7. 【转】No Persistence provider for EntityManager问题
  8. SQL SERVER 数据库概括
  9. Linux系统(二)常用命令、进程管理
  10. Samba共享目录的多用户权限设置案例
  11. Microsoft Visio 2010简体中文版
  12. 实验第七节——用户chaincode相关操作
  13. C# 合并多个PDF
  14. **LPC1788加密与解密方法**
  15. 学习3DMAX的几点收获
  16. HTML5期末大作业:个人网站设计——简单响应式个人博客HTML模板(8页面) HTML+CSS+JavaScript...
  17. std::adjacent_find 用法
  18. 国外开放课程及一些国外大学的网址
  19. 占书明:电脑只能上扣扣QQ和微信,无法打开网页,解决办法!
  20. 微信小程序苹果IOS手机无法加载显示临时图片路径

热门文章

  1. 检测IE8及以下的浏览器并安装chrome frame插件
  2. 利用R通过顺企网根据公司名称爬取企业地址
  3. web概念简述,HTML学习笔记
  4. 软件开发辅助工具收集
  5. 2008年最经典的局域网聊天视频会议软件(不要错过)
  6. vue + mavon-editor编辑器
  7. 注册表-注册表中的启动项!特全的那种!
  8. 与伙伴同行,Serverless 让创新触手可及
  9. 过完春节,我最想见到的人是贾跃亭
  10. 深圳市2023年民营及中小企业改制上市培育资助项目申请指南