java操作es集群模糊查询等

2023-09-18 08:32:42

首先引入依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.17.13</version>
</dependency>

这个依赖中已经包含了一下这些依赖,我们只需要在项目中引入这个依赖即可。
在这里插入图片描述

配置

es使用的是集群配置。引入上面的依赖后我们只需要在springboot项目当中添加以下的配置即可。

spring:
  data:
    elasticsearch:
      repositories:
        enabled: true
  elasticsearch:
    username: your username
    password: your password word
    uris: http://ip1:port1,http://ip2:port2,http://ip3:port3

使用java操作es

首先引入bean。注意后面导包的时候要用org下面的包而不是co下面的。

import org.elasticsearch.client.RestHighLevelClient;
@Autowired
RestHighLevelClient client;
  • 判断某一个索引是否存在
public boolean existIndex(String index) {
    GetIndexRequest indexRequest = new GetIndexRequest(index);
    boolean exists = false;
    try {
        exists = client.indices().exists(indexRequest, RequestOptions.DEFAULT);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    System.out.println(exists);
    return exists;
}

根据id查询文档信息

public String getDocument(String indexName,long id) {
   GetRequest getRequest = new GetRequest(indexName, id+"");
    try {
        GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
        Map<String, Object> source = documentFields.getSource();
        System.out.println(source);
        return JSON.toJSONString(documentFields);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

批量查询文档信息

public SearchHits getBatchDocument(String indexName, int size) {
   SearchRequest searchRequest = new SearchRequest(indexName);
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.size(size);
    searchRequest.source(searchSourceBuilder);
    try {
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        return searchResponse.getHits();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
  • 根据字段值来检索(不是精确匹配)
public SearchHits getMatchDocument(String indexName, String field, String content) {
    SearchRequest searchRequest = new SearchRequest(indexName);

    SearchSourceBuilder builder = new SearchSourceBuilder();
    //这里这个条件只能加一个,再加一个会覆盖前面的内容
    builder.query(QueryBuilders.matchQuery(field, content));
    builder.size(10);
    searchRequest.source(builder);
    try {
        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        return search.getHits();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
  • 部分字段精确查询,部分模糊查询,部分范围查询。同时进行分页
public SearchHits getMatchesDocument(String indexName, Map<String, String> map) {
   SearchRequest request = new SearchRequest(indexName);
    SearchSourceBuilder builder = new SearchSourceBuilder();


    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    //逻辑删除标志必须是false,精确查询
    boolQuery.must(QueryBuilders.termQuery("del_flag", "false"));

    //按照时间范围查询
    String beginTime = map.remove("beginTime");
    String endTime = map.remove("endTime");
    boolQuery.must(QueryBuilders.rangeQuery("create_time").gte(beginTime).lte(endTime));

    //分页查询
    int pageNo = Integer.parseInt(map.remove("pageNo"));
    int pageSize = Integer.parseInt(map.remove("pageSize"));
    builder.from((pageNo-1)*pageSize);
    builder.size(pageSize);
    map.forEach((k, v) -> {
        //按照字段模糊查询
        boolQuery.must(QueryBuilders.matchPhraseQuery(k, v));
    });
    builder.query(boolQuery);
    request.source(builder);
    try {
        SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
        return searchResponse.getHits();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

我们查询的结果中有"_score" : 2.8526313这一项,分数用于判断模糊查询的匹配程度。分数越高匹配程度越高。不需要的话可以查询的时候取消评分降低性能消耗。

  • 对多个字段进行查询,类似于实现sql里面的where id in (******) and delFlag=*的效果

注意,es根据字段多个值进行查询的时候,需要加上keyword表示不进行分词处理,用于关键词搜索,不然会出现异常的情况,查询到的结果很奇怪。用法如下:

//根据字段值进行集合查询
boolQuery.must(QueryBuilders.termsQuery(fieldName+".keyword", values));
//逻辑删除标志必须是false,精确查询
boolQuery.must(QueryBuilders.termQuery("del_flag", "false"));

总结一下涉及到的查询:

  • 词条查询:term查询,类似=
  • 多值查询:tearms查询,类似in。 ElasticSearch 5.0以后,string类型有重大变更,移除了string类型,string字段被拆分成两种新的数据类型: text用于全文搜索的,而keyword用于关键词搜索。
  • 模糊查询:withcard,类似like。里面?单表单个字符,*代表多个字符
  • 范围查询:range
  • 匹配查询:match,单个字段匹配一个值。
  • 匹配查询:multiMatch,多个字段匹配一个值。
  • 复合查询:boolmust必须满足条件。must_not必须不满足。
    should类似于orfilter关闭评分,提高查询效率。

附上官方文档

参考文章1
参考文章2
参考文章3
参考文章4

更多推荐

提升群辉AudioStation音乐体验,实现公网音乐播放

文章目录本教程解决的问题是:按照本教程方法操作后,达到的效果是本教程使用环境:1群晖系统安装audiostation套件2下载移动端app3内网穿透,映射至公网很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿,于是打开手机上的某雅软件和某音乐软件点进去一看:奈何目前移动端的娱乐软件广告很烦人,不知不觉就会点进去而且不好

vue基础知识十一:Vue组件之间的通信方式都有哪些?

一、组件间通信的概念开始之前,我们把组件间通信这个词进行拆分组件通信都知道组件是vue最强大的功能之一,vue中每一个.vue我们都可以视之为一个组件通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的。广义上,任何信息的交通都是通信组件间通信即指组件(.vue)通过某种方式来传递信息以达到某个目的举

动漫ip受著作权法保护吗?

受保护的,不过你得申请版权保护,不然,你难以说明这个作品的所有者是你啊,你可以了解一下可信时间戳,他能起到版权保护的作用。版权保护的重点是证明:什么人在什么时间拥有什么作品,只要原创作者能提供这样的证据就能保护自己的版权。现在每个地级城市基本上都有版权局,你可以通过版权局对你的作品进行版权登记证书的申请来保护自己的版权

【实训项目】智联校友会小程序

1.项目背景作为某某省唯一一所中医药高等院校,××大学已经走过了30个春秋,截止到现在,我校已有近十万名校友遍布全国各地,校友在社会各界享有良好声誉,校友与学校相互成为密不可分的无形资源。然而,在广大在校学生中,还有很多校友意识薄弱,对和自己息息相关的校友工作并不了解。校友会管理系统是代表学校联系和服务校友的职能系统,

半导体产品使用高温老化测试技术

主要功能:为了达到满意的合格率,几乎所有产品在出厂前都必须经过老化处理。制造商如何在不缩短老化时间的情况下提高效率?本文介绍了一种在老化过程中进行功能测试的新方法,以减少和缩短与老化过程相关的成本和时间问题。在半导体行业,关于器件老化存在着各种争论。与其他产品一样,半导体随时可能因各种原因而失效。老化是通过使半导体超载

spring ioc

1.什么是SpringSpring框架是一个分层的、面向切面的Java应用程序的一站式轻量级解决方案,它是Spring技术栈的核心和基础,是为了解决企业级应用开发的复杂性而创建的。>简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。介于SpringMVC与Mybatis之间的中间层框

【java】【SpringBoot】【四】原理篇 bean、starter、核心原理

目录一、自动配置1、bean加载方式(复习)1.1加载方式-xml方式生命bean1.2加载方式-xml+注解方式声明bean1.3注解方式声明配置类1.4FactoryBean1.5proxyBeanMethod属性1.6使用@Import注解导入1.7使用上下文对象在容器初始化完毕后注入bean1.8导入实现了Im

Django Web开发入门基础

官方有很详细的文档,但是看过几遍之后如果要翻找还是有点麻烦,本文算作是学习笔记,提取一些关键点记录下来,另附上官方教程WritingyourfirstDjangoapp注:文中的指令使用py,是在Windows上,macOS要使用python31.安装DjangoDjango是一个基于Python的Web开发框架,安装

git使用说明

配置hosts配置C:\Windows\System32\drivers\etc\hosts192.168.**.**git.wl.com本地git账号配置(xxx在gitlab个人profile中)打开gitbashgitconfig--globaluser.namexxxxgitconfig--globaluser

使用springcloud-seata解决分布式事务问题-2PC模式

目录一、建立undo_log表二、安装事务协调器:seata-server三、整合可以查看官网:快速启动|Seata一、建立undo_log表--注意此处0.3.0+增加唯一索引ux_undo_logCREATETABLE`undo_log`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`b

华为OD机试 - 滑动窗口最大和 - 滑动窗口(Java 2023 B卷 100分)

目录专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明华为OD机试2023B卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题

热文推荐