ElasticSearch6.x版本的SpringBoot增删改查操作和ElasticSearch6.x版本的过滤查询
文章目录
- 一、教学讲解视频
- 二、SpringBoot操作ElasticSearch前期准备工作
- 三、SpringBoot增删改查ElasticSearch
- 1.新增修改
- 2.删除
- 3.查询
- 四、ElasticSearch中的过滤查询
- 1.概念介绍
- 2.过滤语法
- 3.常见的过滤器类型
- ① term filter
- ② terms filter
- ③ ranage filter
- ④ exists filter
- ⑤ ids filter
一、教学讲解视频
教学讲解视频地址:视频地址
二、SpringBoot操作ElasticSearch前期准备工作
1.先在pom.xml里面引入依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.然后在SpringBoot项目中增加以下配置。
这里我是用HTTP的方式进行连接,端口是9200。如果你们是用TCP方式进行连接的话,端口记得改成9300。
@Configuration
public class ESRestClientConfig extends AbstractElasticsearchConfiguration {@Override@Beanpublic RestHighLevelClient elasticsearchClient() {final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("127.0.0.1:9200").build();return RestClients.create(clientConfiguration).rest();}}
3.编写要创建索引和类型的实体。
记得生成getter和setter方法哦。
@Document
: 代表一个文档记录,使用此注解项目启动后自动创建索引和类型
indexName
: 用来指定索引名称
type
: 用来指定索引类型
@Id
: 用来将对象中id和ES中_id映射
@Field
: 用来指定ES中的字段对应Mapping
type
: 用来指定ES中存储类型
analyzer
: 用来指定使用哪种分词器
@Document(indexName = "online_house_achieve", type = "house")
public class House {@Idprivate Long id; //房屋idprivate String coverPhoto; //封面图片private String ownerShip; //房本图片private BigDecimal money; //租金(元/月)// @Field(type = FieldType.Text, analyzer ="ik_max_word")private String houseType; //户型private BigDecimal area; //面积// @Field(type = FieldType.Keyword)private String orientation; //朝向// @Field(type = FieldType.Text, analyzer ="ik_max_word")private String floor; //楼层private String renovation; //装修private Integer category; //房屋出售种类// @Field(type = FieldType.Text, analyzer ="ik_max_word")private String location; //房屋位置// @Field(type = FieldType.Text, analyzer ="ik_max_word")private String info; //房屋简介// @Field(type = FieldType.Text, analyzer ="ik_max_word")private String details; //房屋详情private Long userId; //房屋所属中介id// @Field(type = FieldType.Object)private User user; //房屋所属中介private Date createTime; //创建时间// @Field(type = FieldType.Date)private Date updateTime; //更新时间private Integer state; //房屋状态
4.编写Repository接口。
public interface HouseRepository extends ElasticsearchRepository<House,String> {}
5.启动类上加上Repository接口扫描。
@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "com.wx.programmer.repository")
public class OnlineHouseAchieve
{public static void main( String[] args ){SpringApplication.run(OnlineHouseAchieve.class, args);}
}
这样前期准备工作就完成了~
三、SpringBoot增删改查ElasticSearch
1.新增修改
Tips:如果传id的话,id在ES中存在则修改更新数据,如果id在ES中不存在,则新增数据。如果不传id,则新增一条_id随机的数据。
使用spring-data-elasticsearch完成新增修改操作:
@Testpublic void testSaveOrUpdate() {House house = new House();house.setId(1L);house.setUpdateTime(new Date());house.setInfo("中装一室一厅,楼层好,采光足,稀缺房源");house.setDetails("半径200米内有:工商银行,建设银行,农业银行,邮电局,中国电信,民航总医院,朝阳区第二医院,小庄医院,易出莲花,华堂商场,京客隆,法宝超市,苏宁电器,国美电器,郭林家常菜,肯德基,麦当劳,必胜客等多家餐厅,北京纺织技术学校,甘露园小学。");houseRepository.save(house);}
使用RestHighLevelClient完成新增修改操作:
IndexRequest request = new IndexRequest("online_house_achieve", "house");
request.id("1");
request.source(JSONObject.toJSONString(house), XContentType.JSON);
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
logger.info("操作结果:" + response.getResult());
2.删除
使用spring-data-elasticsearch完成删除操作:
@Testpublic void testDelete(){House house = new House();house.setId(1L);houseRepository.delete(house);}
使用RestHighLevelClient完成删除操作:
DeleteRequest request = new DeleteRequest("online_house_achieve", "house", "1");DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);logger.info("操作结果:" + response.getResult());
3.查询
使用spring-data-elasticsearch完成查询操作:
Keyword | Sample | Elasticsearch Query String |
---|---|---|
And
|
findByNameAndPrice
|
{"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
|
Or
|
findByNameOrPrice
|
{"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
|
Is
|
findByName
|
{"bool" : {"must" : {"field" : {"name" : "?"}}}}
|
Not
|
findByNameNot
|
{"bool" : {"must_not" : {"field" : {"name" : "?"}}}}
|
Between
|
findByPriceBetween
|
{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
|
LessThanEqual
|
findByPriceLessThan
|
{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
|
GreaterThanEqual
|
findByPriceGreaterThan
|
{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
|
Before
|
findByPriceBefore
|
{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
|
After
|
findByPriceAfter
|
{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
|
Like
|
findByNameLike
|
{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
|
StartingWith
|
findByNameStartingWith
|
{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
|
EndingWith
|
findByNameEndingWith
|
{"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}}
|
Contains/Containing
|
findByNameContaining
|
{"bool" : {"must" : {"field" : {"name" : {"query" : "**?**","analyze_wildcard" : true}}}}}
|
In
|
findByNameIn (Collection<String>names)
|
{"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}}
|
NotIn
|
findByNameNotIn (Collection<String>names)
|
{"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}}
|
Near
|
findByStoreNear
|
Not Supported Yet !
|
True
|
findByAvailableTrue
|
{"bool" : {"must" : {"field" : {"available" : true}}}}
|
False
|
findByAvailableFalse
|
{"bool" : {"must" : {"field" : {"available" : false}}}}
|
OrderBy
|
findByAvailable TrueOrderByNameDesc
|
{"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}}
|
spring-data-elasticsearch操作方式有很多种,我们这里举例演示一种,其他的根据上面表格内容举一反三~
1.根据houseType字段和orientation字段查询数据:
public interface HouseRepository extends ElasticsearchRepository<House,String> {// 根据户型和朝向查询List<House> findByHouseTypeAndOrientation(String houseType, String orientation);
}
@Testpublic void testESSearch(){List<House> result = houseRepository.findByHouseTypeAndOrientation("两室一厅一卫", "南");logger.info("查询结果:{}", JSONObject.toJSONString(result));}
使用RestHighLevelClient完成查询操作:
RestHighLevelClient操作方式有很多种,我们这里举例演示几种,其他的根据上面表格内容举一反三~
1.根据id降序排序,然后获取前两个数据。
SearchRequest searchRequest = new SearchRequest();SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.from(0).size(2).sort("id", SortOrder.DESC).query(QueryBuilders.matchAllQuery());searchRequest.indices("online_house_achieve").types("house").source(sourceBuilder);SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = search.getHits().getHits();for (SearchHit hit : hits) {logger.info(hit.getSourceAsString());}
2.高亮查询,查询orientation字段值为“南”的文档数据,并高亮展示。
SearchRequest searchRequest = new SearchRequest();SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("orientation").preTags("<span style='color:red;'>").postTags("</span>");sourceBuilder.highlighter(highlightBuilder).query(QueryBuilders.termQuery("orientation","南"));searchRequest.indices("online_house_achieve").types("house").source(sourceBuilder);SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = search.getHits().getHits();for (SearchHit hit : hits) {logger.info(hit.getSourceAsString());Map<String, HighlightField> highlightFields = hit.getHighlightFields();highlightFields.forEach((k,v)-> logger.info("key: "+k + " value: "+v.fragments()[0]));}
3.布尔查询,查询出money字段值在2500~2700之间的数据或者category字段值为2的文档数据:
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("money").from(2500).to(2700);
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", 2);
boolQueryBuilder.should(termQueryBuilder).should(rangeQueryBuilder);
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
for (SearchHit hit : hits) {logger.info(hit.getSourceAsString());
}
4.布尔查询,将上面代码改造,只查询出money字段值在2500~2700之间的数据:
boolQueryBuilder.should(termQueryBuilder).must(rangeQueryBuilder);
5.布尔查询,将上面代码改造,只查询出category字段值不为2的并且money字段值在2500~2700之间的文档数据。
boolQueryBuilder.mustNot(termQueryBuilder).must(rangeQueryBuilder);
6.过滤查询,先过滤出category字段值为2的数据,然后从过滤出的数据中查找orientation字段值为"东"的数据。
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("orientation", "东");
boolQueryBuilder.must(termQueryBuilder).filter(QueryBuilders.termQuery("category", 2));
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
for (SearchHit hit : hits) {logger.info(hit.getSourceAsString());
}
四、ElasticSearch中的过滤查询
1.概念介绍
其实准确来说,ES中的查询操作分为2种: 查询(query)
和过滤(filter)
。查询即是之前提到的query查询,它 (查询)默认会计算每个返回文档的得分,然后根据得分排序
。而过滤(filter)只会筛选出符合的文档,并不计算得分,且它可以缓存文档 。所以,单从性能考虑,过滤比查询更快
。
有关查询的用法,请浏览博客:ElasticSearch6.x版本概念介绍及Kibana操作的增删改查常用API
换句话说,过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时, 应先使用过滤操作过滤数据, 然后使用查询匹配数据。
具体流程看下图:
2.过滤语法
GET /online_house_achieve/house/_search
{"query": {"bool": {"must": [{"match_all": {}}],"filter": {"range": {"id": {"gte": 5,"lte": 8}}}}}
}
在执行filter和query时,先执行filter在执行query。
ElasticSearch会自动缓存经常使用的过滤器,以加快性能。
3.常见的过滤器类型
① term filter
先过滤出category字段为2的文档数据,然后再从过滤出来的文档数据中查询orientation字段为 “东” 的文档数据:
GET /online_house_achieve/house/_search
{"query": {"bool": {"must": [{"term": {"orientation": {"value": "东"}}}],"filter": {"term": {"category": 2}}}}
}
② terms filter
先过滤出category字段为1或2的文档数据,然后再从过滤出来的文档数据中查询orientation字段为 “东” 的文档数据:
GET /online_house_achieve/house/_search
{"query": {"bool": {"must": [{"term": {"orientation": {"value": "东"}}}],"filter": {"terms": {"category":[1,2]}}}}
}
③ ranage filter
先过滤出id字段值在5~8之间的文档数据,然后再从过滤出来的文档数据中查询orientation字段为 “东” 的文档数据:
GET /online_house_achieve/house/_search
{"query": {"bool": {"must": [{"term": {"orientation": {"value": "东"}}}],"filter": {"range": {"id": {"gte": 5,"lte": 8}}}}}
}
④ exists filter
先过滤出id字段存在的文档数据,然后再从过滤出来的文档数据中查询orientation字段为 “东” 的文档数据:
GET /online_house_achieve/house/_search
{"query": {"bool": {"must": [{"term": {"orientation": {"value": "东"}}}],"filter": {"exists": {"field": "id"}}}}
}
⑤ ids filter
先过滤出id字段值为5或8的文档数据,然后再从过滤出来的文档数据中查询orientation字段为 “东” 的文档数据:
GET /online_house_achieve/house/_search
{"query": {"bool": {"must": [{"term": {"orientation": {"value": "东"}}}],"filter": {"ids": {"values": [5, 8]}}}}
}
ElasticSearch6.x版本的SpringBoot增删改查操作和ElasticSearch6.x版本的过滤查询相关推荐
- MyBatis的增删改查操作
MyBatis的增删改查操作 简单实现一下MyBatis的增删改查,并且在控制台输出结果. 文章目录 MyBatis的增删改查操作 MyBatis的简单入门 一.查询操作 二.增加操作 三.修改操作 ...
- 国产化之路-统信UOS /Nginx /Asp.Net Core+ EF Core 3.1/达梦DM8实现简单增删改查操作
引言 经过前期的准备工作,.net core 3.1的运行环境和WEB服务器已经搭建完毕,这里需要注意一下,达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官 ...
- JQuery Datatables editor进行增删改查操作(一)
背景 editor作为Datatables的插件之一,功能十分强大,有全行编辑模式.泡泡编辑模式.行内编辑模式.个人觉得,除了泡泡编辑模式外,其他两种模式功能在实际项目中会经常使用到,泡泡模式提供了模 ...
- javaweb简单的登录增删改查系统_国产化之路统信UOS /Nginx /Asp.Net Core+ EF Core 3.1/达梦DM8实现简单增删改查操作...
引言 经过前期的准备工作,.net core 3.1的运行环境和WEB服务器已经搭建完毕,这里需要注意一下,达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官 ...
- MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物
MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...
- 对Android手机系统日历数据增删改查操作详解
Android手机系统日历数据增删改查详解 前段时间需要开发提取手机系统的日历数据的功能,自己开始研究了一下,刚开始还是比较懵逼的,经过仔细研究还是能够完全贯通了. 如果不想细细研究,可以直接下载我的 ...
- JDBC中用控制台简单对数据库进行增删改查操作(IDEA.2023)
文章目录 前言 一.首先是每个操作共用的操作大纲 1.注册驱动 2.创建连接 3.编写SQL语句结果,动态值的部分使用?代替 4.创建prepareStatement,并且传入SQL语句的结果 5.占 ...
- Javaweb实现增删改查操作操作
Javaweb实现增删改查操作操作 一:准备工作 1:Idea编辑器(eclispe和myeclispe都可以,个人推荐使用idea),新建一个web项目 2:数据库mysql 3:需要提前了解的知识 ...
- python+sqlite3-数据库增删改查操作
python+sqlite3-数据库增删改查操作 目录 python+sqlite3-数据库增删改查操作 01.sqlite数据库 02.下载数据库可视化工具 03.创建数据库 04.python连接 ...
最新文章
- C/C++语言编程的隐患!
- 2、Linux基础练习题
- MySQL大批量数据插入
- 网易云的朋友给我这份339页的Android面经,成功入职阿里
- HTML5基础学习-表格标签
- 关闭Windows10 易升
- 怎么用计算机直接截图,电脑怎样截图又快又方便 1分钟教你如何快速截图
- 深入理解c++之struct构造函数
- java系统过载保护_浅谈过载保护
- QT打包应用程序文件步骤
- 数学建模竞赛题目 资产清算交易策略
- 菜鸟云打印接入Demo
- 第四次作业 个人学习总结 霍兰德- 职业兴趣测评
- java上看小说软件_i悦读小说阅读软件 For java
- 什么是游戏盾?快快网络安全产品
- 学习gitlab-runner
- win10环境下配置Gradle
- 如何用 MacBook 提高工作效率 【配置篇】
- requests.exceptions.SSLError: HTTPSConnectionPool(host=‘XXX‘, port=443)
- 图像处理:像素间的一些基本关系(领域、领接性、通路、连通分量、距离)