文章目录

  • 一、教学讲解视频
  • 二、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版本的过滤查询相关推荐

  1. MyBatis的增删改查操作

    MyBatis的增删改查操作 简单实现一下MyBatis的增删改查,并且在控制台输出结果. 文章目录 MyBatis的增删改查操作 MyBatis的简单入门 一.查询操作 二.增加操作 三.修改操作 ...

  2. 国产化之路-统信UOS /Nginx /Asp.Net Core+ EF Core 3.1/达梦DM8实现简单增删改查操作

    引言 经过前期的准备工作,.net core 3.1的运行环境和WEB服务器已经搭建完毕,这里需要注意一下,达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官 ...

  3. JQuery Datatables editor进行增删改查操作(一)

    背景 editor作为Datatables的插件之一,功能十分强大,有全行编辑模式.泡泡编辑模式.行内编辑模式.个人觉得,除了泡泡编辑模式外,其他两种模式功能在实际项目中会经常使用到,泡泡模式提供了模 ...

  4. javaweb简单的登录增删改查系统_国产化之路统信UOS /Nginx /Asp.Net Core+ EF Core 3.1/达梦DM8实现简单增删改查操作...

    引言 经过前期的准备工作,.net core 3.1的运行环境和WEB服务器已经搭建完毕,这里需要注意一下,达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官 ...

  5. MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物

    MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...

  6. 对Android手机系统日历数据增删改查操作详解

    Android手机系统日历数据增删改查详解 前段时间需要开发提取手机系统的日历数据的功能,自己开始研究了一下,刚开始还是比较懵逼的,经过仔细研究还是能够完全贯通了. 如果不想细细研究,可以直接下载我的 ...

  7. JDBC中用控制台简单对数据库进行增删改查操作(IDEA.2023)

    文章目录 前言 一.首先是每个操作共用的操作大纲 1.注册驱动 2.创建连接 3.编写SQL语句结果,动态值的部分使用?代替 4.创建prepareStatement,并且传入SQL语句的结果 5.占 ...

  8. Javaweb实现增删改查操作操作

    Javaweb实现增删改查操作操作 一:准备工作 1:Idea编辑器(eclispe和myeclispe都可以,个人推荐使用idea),新建一个web项目 2:数据库mysql 3:需要提前了解的知识 ...

  9. python+sqlite3-数据库增删改查操作

    python+sqlite3-数据库增删改查操作 目录 python+sqlite3-数据库增删改查操作 01.sqlite数据库 02.下载数据库可视化工具 03.创建数据库 04.python连接 ...

最新文章

  1. C/C++语言编程的隐患!
  2. 2、Linux基础练习题
  3. MySQL大批量数据插入
  4. 网易云的朋友给我这份339页的Android面经,成功入职阿里
  5. HTML5基础学习-表格标签
  6. 关闭Windows10 易升
  7. 怎么用计算机直接截图,电脑怎样截图又快又方便 1分钟教你如何快速截图
  8. 深入理解c++之struct构造函数
  9. java系统过载保护_浅谈过载保护
  10. QT打包应用程序文件步骤
  11. 数学建模竞赛题目 资产清算交易策略
  12. 菜鸟云打印接入Demo
  13. 第四次作业 个人学习总结 霍兰德- 职业兴趣测评
  14. java上看小说软件_i悦读小说阅读软件 For java
  15. 什么是游戏盾?快快网络安全产品
  16. 学习gitlab-runner
  17. win10环境下配置Gradle
  18. 如何用 MacBook 提高工作效率 【配置篇】
  19. requests.exceptions.SSLError: HTTPSConnectionPool(host=‘XXX‘, port=443)
  20. 图像处理:像素间的一些基本关系(领域、领接性、通路、连通分量、距离)

热门文章

  1. python中星号(*)的用法
  2. 长虹LED42C2080i液晶电视(ZLM41机芯)HDMI端输出无图像
  3. shixibaogao
  4. 配置Java环境变量有什么用?
  5. linux中文文件夹如何改回英文
  6. python的dropna_python--data.dropna
  7. jenkins汉化一部分问题(一半中文一半英文)解决
  8. centos8Linux内核版本,Centos 8升级内核版本
  9. 横竖屏切换SurfaceView 大小的调整
  10. 策略梯度简明逐步公式推导