ElasticSearch6.x版本的SpringBoot增删改查操作和ElasticSearch6.x版本的过滤查询

news2024/11/16 15:58:45

文章目录

  • 一、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
    @Bean
    public 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 {

	@Id
    private Long id; //房屋id

    private 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完成新增修改操作:

  @Test
  public 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完成删除操作:

 @Test
 public 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完成查询操作:

KeywordSampleElasticsearch Query String
AndfindByNameAndPrice{"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
OrfindByNameOrPrice{"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
IsfindByName{"bool" : {"must" : {"field" : {"name" : "?"}}}}
NotfindByNameNot{"bool" : {"must_not" : {"field" : {"name" : "?"}}}}
BetweenfindByPriceBetween{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
LessThanEqualfindByPriceLessThan{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
GreaterThanEqualfindByPriceGreaterThan{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
BeforefindByPriceBefore{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
AfterfindByPriceAfter{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
LikefindByNameLike{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
StartingWithfindByNameStartingWith{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
EndingWithfindByNameEndingWith{"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}}
Contains/ContainingfindByNameContaining{"bool" : {"must" : {"field" : {"name" : {"query" : "**?**","analyze_wildcard" : true}}}}}
InfindByNameIn
(Collection<String>names)
{"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}}
NotInfindByNameNotIn
(Collection<String>names)
{"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}}
NearfindByStoreNearNot Supported Yet !
TruefindByAvailableTrue{"bool" : {"must" : {"field" : {"available" : true}}}}
FalsefindByAvailableFalse{"bool" : {"must" : {"field" : {"available" : false}}}}
OrderByfindByAvailable
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);
}
 @Test
 public 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());
    Map<String, HighlightField> highlightFields = hit.getHighlightFields();
    highlightFields.forEach((k,v)-> logger.info("key: "+k + " value: "+v.fragments()[0]));
}

4.布尔查询,将上面代码改造,只查询出money字段值在2500~2700之间的数据:

boolQueryBuilder.should(termQueryBuilder).must(rangeQueryBuilder);

5.布尔查询,将上面代码改造,只查询出category字段值不为2的并且money字段值在2500~2700之间的文档数据。

boolQueryBuilder.mustNot(termQueryBuilder).must(rangeQueryBuilder);

三、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]
        }
      }
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【阶段二】Python数据分析Pandas工具使用05篇:数据预处理:数据的规范化

本篇的思维导图: 数据预处理:数据的规范化 数据标准化(归一化)处理是数据挖掘的一项基础工作。不同评价指标往往具有不同的量纲,数值间的差别可能很大,不进行处理可能会影响数据分析的结果。为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按…

LEETCODE 98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1&#xff1a; 输入&a…

+ 数学与算法系列之牛顿、二分迭代法求解非线性方程

1. 前言 前文介绍了如何使用“高斯消元法”求解线性方程组。 本文秉承有始有终的态度&#xff0c;继续介绍“非线性方程”的求解算法。 本文将介绍 2 个非线性方程算法&#xff1a; 牛顿迭代法。二分迭代法。 牛顿迭代法&#xff08;Newtons method&#xff09;又称为牛顿…

C#,图像二值化(13)——基于双峰平均值的全局阈值算法与源程序

1、图像二值化概述 图像二值化是将彩色图像转换为黑白图像。大多数计算机视觉应用程序将图片转换为二进制表示。图像越是未经处理&#xff0c;计算机就越容易解释其基本特征。 二值化过程 在计算机存储器中&#xff0c;所有文件通常以灰度级的形式存储&#xff0c;灰度级具有…

Linux Free 命令

目录 Free命令有什么用 各项名词解释 服务器实际可用内存看哪个值 为什么free2是实际可用内存 结论 Free命令语法 Free命令有什么用 熟悉的都知道&#xff0c;这是用来Linux主机内存使用情况的。如下&#xff1a; 各项名词解释 可以把上图看为3部分&#xff0c;分别是 M…

介绍一个Python可视化神器,绘制出来的图表惊艳了所有的人!!

新年快乐&#xff0c;时间过得真的是很快&#xff0c;已经到了新的一年了&#xff0c;今天小编给大家来介绍一款十分好用的可视化模块&#xff0c;D3Blocks&#xff0c;不仅可以用来绘制可动态交互的图表&#xff0c;并且导出的图表可以是HTML格式&#xff0c;方便在浏览器上面…

【小程序】模板与配置

文章目录WXML 模板语法数据绑定事件绑定bindtap 的语法格式bindinput 的语法格式实现文本框和 data 之间的数据同步条件渲染wx:ifhidden列表渲染WXSS 模板样式rpx样式导入全局样式和局部样式全局配置windowtabBar页面配置网络数据请求配置 request 合法域名发起 GET 请求发起 P…

XMLHttpRequest的基本使用

1、什么XMLHttpRequest XMLHttpRequest&#xff08;简称 xhr&#xff09;是浏览器提供的 Javascript 对象&#xff0c;通过它&#xff0c;可以请求服务器上的数据资源。之前所学的 jQuery 中的 Ajax 函数&#xff0c;就是基于 xhr 对象封装出来的。 2、使用xhr发起GET请求 步骤…

Java --- spring6的Bean的作用域

目录 一、bean的作用域为单例 二、bean的作用域为多例 三、Bean作用域的Scope属性的其它值 四、Bean作用域的自定义Scope 一、bean的作用域为单例 public class SpringBean {public SpringBean() {System.out.println("构造方法被调用");} } spring配置文件 &…

Java中的Future详解

1. Future的应用场景 在并发编程中&#xff0c;我们经常用到非阻塞的模型&#xff0c;在之前的多线程的三种实现中&#xff0c;不管是继承thread类还是实现runnable接口&#xff0c;都无法保证获取到之前的执行结果。通过实现Callback接口&#xff0c;并用Future可以来接收多线…

python 生成csv中文出现乱码问题解决

最开始的核心代码如下: with open("/hardisk/exeport.csv", "w") as f: 核心代码 f.writelines("时间,事件描述,源ip,源端口,目的ip,目的端口,协议,告警等级,接口,告警次数,事件英文详述" "\r") for v in raw: f.write(str(v).re…

Python 二维码的读取与生成:使用链接生成二维码、读取二维码里的链接

Python 二维码的读取与生成演示① 使用链接生成二维码② 读取二维码里的链接[ 文章推荐 ] Python 绘制中国地图&#xff1a;使用 pyecharts 最新版本绘制中国地图实例详解&#xff0c;个性化地图定制及常用参数解析 ① 使用链接生成二维码 通过 pip install qrcode 安装 qrco…

C#语言实例源码系列-游戏-实现贪吃蛇

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

云原生技术在离线交付场景中的实践

作者介绍&#xff1a;郭逊&#xff0c;交付部总监&#xff0c;7年运维经验&#xff0c;云原生深度爱好者软件产品只有交付到用户手中才有价值&#xff0c;本人在面向政府等 ToG 场景的软件交付领域具有数年的工作经验&#xff0c;深知其中痛点。今天借助这篇文章&#xff0c;分…

启动报名:首届“星河杯”隐私计算大赛正式上线

当前&#xff0c;隐私计算技术发展迅速&#xff0c;行业应用稳步增长&#xff0c;逐渐成为实现数据安全流通的关键技术路径之一。然而&#xff0c;隐私计算发展过程中仍面临技术应用瓶颈、行业影响有限等挑战&#xff0c;亟需加快技术攻关、提升行业影响、深化产业应用。在此背…

PyFlink1.16.0 使用说明:建表及连接Mysql数据库

PyFlink1.16.0 使用说明&#xff1a;建表及连接Mysql数据库引言安装运行环境PyFlink创建作业环境一、创建一个 Table API 批处理表环境二、创建一个 Table API 流处理表环境三、创建一个 DataStream API 数据流处理环境PyFlink建表一、从Python List对象创建一个 Table二、创建…

理解Cookie 和 Session 的工作流程

又是一年初,首先祝大家新年快乐!!!Cookie什么是Cookie?由于HTTP是一种无状态的协议, 服务器单从网络连接上是无法知道用户身份的. 这时候服务器就需要给客户端发一个cooki, 用来确认用户的身份.简单的来说, cookie就是客户端保存用户信息的一种机制, 用来记录用户的一些信息.找…

基于JAVA的数据可视化分析平台,自由制作任何您想要的数据看板,支持接入SQL、CSV、Excel、HTTP接口、JSON等

数据可视化分析平台 自由制作任何您想要的数据看板 简介 DataGear是一款数据可视化分析平台&#xff0c;自由制作任何您想要的数据看板&#xff0c;支持接入SQL、CSV、Excel、HTTP接口、JSON等多种数据源。 完整代码下载地址&#xff1a;基于JAVA的数据可视化分析平台&…

Python模块与包(八)

python学习之旅(八) &#x1f44d;查看更多可以关注查看首页或点击下方专栏目录 一.模块 (1) 什么是模块 一个Python文件,以.py 结尾,能定义函数,类和变量,也能包含可执行的代码 作用&#xff1a;我们可以认为不同的模块就是不同工具包,每一个工具包中都有各种不同的工具(如函…

Vue初识系列【2】

一 Vue入门 1.1 Vue简介 Vue 是一套用于构建用户界面的渐进式框架&#xff0c;发布于 2014 年 2 月。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库&#xff08;如&a…