Java中Elasticsearch使用类似MySQL的OR和AND查询

这篇具有很好参考价值的文章主要介绍了Java中Elasticsearch使用类似MySQL的OR和AND查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文用实例来介绍如何使用Spring Data Elasticsearch的ElasticsearchRestTemplate来操作ES,在Java中Elasticsearch使用类似MySQL的OR和AND进行多条件查询。

官网

Elasticsearch Operations

bool query:

一种复合查询,把其余类型的查询包裹进来,支持以下三种逻辑关系。

must: AND   
must_not:NOT
should:OR

ES查询实例如下:

{
    "bool" : {
        "must" : { "term" : { "component" : "comp_1" } },  // must = And
        "should" : [                                       // should = Or
            { "term" : { "userId" : "A1A1" } },    
            { "term" : { "customerId" : "C1" } },
            { "term" : { "currentRole" : "ADMIN" }}
        ],
        "minimum_should_match" : 1
    }
}

在Java中代码示例:

@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;

org.elasticsearch.index.query.QueryBuilder qb = QueryBuilders
    .boolQuery()
    .must(termQuery("component", currentComponent))
    .should(termQuery("userId", currentUserId))
    .should(termQuery("customerId", currentCustomerId))
    .should(termQuery("currentRole", ADMIN))
    // .must(QueryBuilders.boolQuery().should(QueryBuilders.termsQuery("num", "6","8")))
    .minimumNumberShouldMatch(1);

该must部分是ANDS;

该should部分都或多或少ORS;

除了你可以指定的最小数量should(用s到比赛minimum_should_match),这个最低默认为1,我认为(但你可以将其设置为0,这意味着文件不匹配的should条件也将被返回)。

如果要进行涉及嵌套ANDs和ORs的更复杂的查询,只需将其他布尔查询嵌套在内部must或should部分中。

另外,当您寻找准确的值(id等)时,也许可以使用术语查询代替匹配查询,从而节省了分析阶段的时间(如果对这些字段进行了分析,则不一定有意义)对于ID)。如果对它们进行了分析,则您仍然可以这样做,但前提是您必须确切地知道术语的存储方式(例如,标准分析器将它们存储为小写)。

匹配关键字示例:

// es 查询满足条件1 或满足条件2 的结果合集
//主查询
matchQuery.must(
        QueryBuilders.boolQuery()
        .should(QueryBuilders.matchQuery("xm","好的"))//分词后匹配
            .should(QueryBuilders.matchParaseQuery("addr","钱江路"))//匹配完整词
            .should(QueryBuilders.termQuery("status",0))//完全匹配
            .should(QueryBuilders.termsQuery("keyword",string[]))//多关键字匹配
            );

    SearchResponse response = client.prepareSearch("indexName")
            .setFrom(0)
            .setSize(10)
            .setQuery(matchQuery)
            .get();

    SearchHits hits = response.getHits();
    int count = (int) hits.getTotalHits();

    for(SearchHit one:hits)
    {
        //遍历结果处理
    }

如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。文章来源地址https://www.toymoban.com/news/detail-431306.html

到了这里,关于Java中Elasticsearch使用类似MySQL的OR和AND查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux——信号处理函数与阻塞状态的进程

    这篇博客记录一下我在编写一个简单的多进程回声服务器的时候出现的问题。 这个问题就在于忽略了几个有关于信号处理函数的基本常识: 用通俗的话讲信号注册函数(signal、sigaction)的功能:进程告诉操作系统,当以后收到向信号注册函数传入的信号时,你帮我调用一下信号

    2024年02月13日
    浏览(40)
  • Linux------进程的fork()详解

    目录 前言 一、fork()的使用 二、fork()的返回值 我们为什么要创建子进程? 父进程与子进程的分流 三、fork的一些难理解的问题 1.fork干了什么事情? 2.fork为什么会有两个返回值  3.fork的两个返回值,为什么会给父进程返回子进程pid,给子进程返回0? 4.fork之后,父子进程谁先

    2024年01月18日
    浏览(37)
  • 【Linux进程】查看进程&&fork创建进程

    目录 前言  1. 查看进程  2. 通过系统调用创建进程-fork初识 总结          你有没有想过在使用Linux操作系统时,后台运行的程序是如何管理的?在Linux中,进程是一个非常重要的概念。本文将介绍如何查看当前运行的进程,并且讨论如何使用fork创建新的进程。通过了解这些

    2024年01月22日
    浏览(53)
  • Linux 内核学习 3 - 虚拟内存和物理内存

    虚拟内存其实是 CPU 和操作系统使用的一个障眼法,联手给进程编织了一个假象,让进程误以为自己独占了全部的内存空间 : 在 32 位系统中,进程以为自己独占了 3G 的内存空间。 在 64 位系统中,进程以为自己独占了 128T 的内存空间。 这么做的好处是,操作系统为每个进程

    2024年01月21日
    浏览(47)
  • 【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系

    ========================================================================= 个人主页点击直达: 小白不是程序媛 Linux专栏: Linux系统化学习 代码仓库: Gitee ========================================================================= 目录 虚拟地址和物理地址 页表 进程地址空间 进程地址空间存在的意义 我们在学

    2024年02月05日
    浏览(50)
  • Linux 从入门到精通:Telnet 命令测试服务端口连通性

    1.1 Telnet 基本信息 Telnet 程序命令是基于 TELNET 协议的远程登录客户端程序。Telnet 是 TCP/IP 协议族的成员,是 Internet 远程登录服务的标准协议和主要方式。 Telnet 命令可以用来远程登录或确定远程服务的状态,比如确定远程服务器的某个端口是否能访问。 使用方式: 如果使用

    2024年02月15日
    浏览(37)
  • linux 测试网络连通性方法

    telnet 协议是 TCP/IP 协议族中的一员,是 Internet 远程登陆服务的标准协议和主要方式。 它为用户提供了在本地计算机上完成远程主机工作的能力。因此我们可以使用telnet 来测试远程机器的连通性。 telnet 软件包安装 1、检测 telnet 包是否安装 2、未安装,则安装 telnet 软件包 3、

    2024年02月09日
    浏览(45)
  • 程序的内存模型\栈区

    栈区注意事项 1、不要返回局部变量地址 2、栈区的数据由编译器管理开辟和释放  编译器:vs2010  输出结果如果有所不同,可以试着查阅编译器的文档。版本不同可能导致结果不同

    2024年02月21日
    浏览(33)
  • Windows 10中使用CMD测试IP端口联通性的方法

    在Windows 10操作系统中,有时候我们需要检查某个IP地址的某个端口是否联通。这对于网络管理员、开发人员或普通用户来说都非常重要。本文将介绍如何在命令提示符 (CMD) 下使用telnet命令来测试IP的端口联通情况。 打开命令提示符(CMD): 在Windows 10中,按下Win键+R,输入\\\"

    2024年02月10日
    浏览(49)
  • 查看 linux 开放的端口

    目录 方法一:使用netstat命令 方法二:使用 ss 命令: 方法三:使用lsof命令 方法四:使用nmap命令 注意 在Linux系统中,要查看已经开放的端口,可以使用一些命令和工具来实现。下面将介绍几种常用的方法。 Netstat命令可以显示网络连接、路由表和网络接口等相关信息,通过

    2024年01月18日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包