java操作es集群模糊查询等

2023-11-10

首先引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.7.10</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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java操作es集群模糊查询等 的相关文章

随机推荐

  • 在广告宣传领域,PS透明屏有哪些优点表现?

    PS透明屏是一种新型的显示技术 它将传统的显示屏幕与透明材料相结合 使得屏幕能够同时显示图像和透过屏幕看到背后的物体 这种技术在商业展示 广告宣传 产品展示等领域有着广泛的应用前景 PS透明屏的工作原理是利用透明材料的特性 通过控制屏幕上的
  • C程序在内存中的布局与常见的漏洞

    1 C程序员通用的漏洞指南 C语言中大多数漏洞都与缓冲区溢出和字符串操作相关 在大多数情况下 都会导致段错误 segmentation fault 但仅过精心设计的输入值 但是 根据体系结构和环境特别设计的恶意输入值可能会导致任意代码的执行
  • UDP/TCP 通信中 server端ip为0的问题

    在UDP或TCP通信中 客户端也可以不需要bind自身IP和端口号 而服务器需要bind自身IP地址和端口号 看代码时候发现在UDP TCP通信中 server端本地信息初始化时ip设置为0了 如上图两个部分代码所示 查了一些资料 INAD
  • [Go版]算法通关村第二关青铜——终于学会链表反转了

    目录 题目 反转链表 解决方法 方法1 借助虚拟头节点反转 方法2 不借助虚拟头节点 仅靠自身反转 方法3 利用递归来反转 题目 反转链表 题目链接 LeetCode 206 反转链表 解决方法 源码地址 GitHub golang版本 方
  • CentOS7.5 搭建ElasticSearch6.4.2 + Kibana6.4.2 环境

    本文目录 1 创建用户 2 授权sudo 3 下载ElasticSearch Kibana 3 1 创建目录 3 2 下载文件 4 配置Elasticsearch 5 配置Kibana 参考资料 看下CentOS版本 root test h
  • 面向对象编程的三大特性详解

    封装 多态和继承是面向对象编程的三大特性 封装 Encapsulation 封装的目的是为了保证变量的安全性 使用者不必在意具体实现细节 而只是通过外部接口即可访问类的成员 如果不进行封装 类中的实例变量可以直接查看和修改 可能给整个代码带
  • latex公式实现居中,多行公式同一个编号

    1 多行居中 gather虽然会居中 内部一般多行公式会分为两个编号 p1 1 1 p2 2 2 可以用split实现伪居中 split的本质是将 后面的公式符号进行对齐 且split环境中可以用 表示换行 begin equation l
  • CMake命令行添加编译参数

    CMake命令行添加编译参数 学习自 coroserver 例程 https github com windoze coroserver coroserver 是一个应用 Boost Asio 和 Boost Coroutine 的 多线程
  • React 官方例子tic-tac-toe完整功能

    官方例子 https reactjs org tutorial tutorial html 完整功能 https github com Mangon ReactStarter
  • redis 十一. IO 多路复用

    目录 一 基础 select poll epoll 二 redis 与多路复用 一 基础 首先知道一下五种io模型有个概念 Blocking IO 阻塞IO NoneBlockin IO 非阻塞IO IO multiplexing redi
  • 深入详解ThreadLocal内存泄漏问题

    1 造成内存泄漏的原因 threadLocal是为了解决对象不能被多线程共享访问的问题 通过threadLocal set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中 这样每个线程使用自己的对象实例 彼此不会影响达
  • 大学毕业后,我就去当了2个月外卖骑手,哭了一整晚

    先简单介绍一下自己 我来自长沙 大学学的的物流管理专业 现在就职于一家互联网公司 从事软件测试工作 我来自长沙县的一个偏远农村 家里兄弟姐妹多 父母无力负担我的学费 很多时候学费都是靠姐姐姐夫接济 我大学也做过很多兼职家教 所以可以支撑我到
  • LaTex中公式太长怎么办(公式跨栏显示)

    目录 问题 方案 1 缩小公式字体 2 公式内容换行 3 公式跨栏居中显示 这些方法我摸索了一个早上才找到的 如果对大家有帮助 请大家给我一键三连 非常感谢 问题 在双列栏中 有一道公式长度实在太长 左思右想 发现无非几种解决办法 方案 1
  • Linux 查看/关闭/禁止开机启动防火墙命令

    1 查看防火墙 firewall 的状态 firewall cmd state 或者 systemctl status firewalld 2 停止防火墙 firewall systemctl stop firewalld service
  • 转换wxDateTime为Python

    wxPython Converting wx DateTime to Python datetime The wxPython GUI toolkit includes its own date time capabilities Most
  • 网安基础知识—【IP地址】

    文章目录 一 什么是IP地址 二 IP地址的分类 三 子网掩码 一 什么是IP地址 IP地址就像我们需要打电话时的电话号码一样 它用来标识网络中的一台主机 每台主机至少有一个IP地址 而且这个IP地址是全网唯一的 IP地址由网路号和主机号两
  • 'Invalid parameter not satisfying: URLString'网络请求的时候get使用特殊字符和汉字崩溃的恶心bug解决方法...

    参数需要转一下的就ok value value stringByAddingPercentEscapesUsingEncoding NSUTF8StringEncoding 转载于 https www cnblogs com godlove
  • 易懂分布式

    转载自 https www jianshu com p f2c31e632f1d 近年来 区块链技术 部分人更愿意称之为分布式账本技术 的走红将分布式技术的概念带入大众的视野 区块链技术之所以备受追捧 一方面是其展现了一种在计算机的辅助下
  • 手机连云服务器传文件,手机云服务器传输文件

    手机云服务器传输文件 内容精选 换一换 本节操作介绍本地Linux操作系统主机通过SCP向Linux云服务器传输文件的操作步骤 登录管理控制台 在ECS列表页面记录待上传文件的云服务器的弹性公网IP 上传文件在本地Linux操作系统主机上执
  • java操作es集群模糊查询等

    首先引入依赖