jjzjj

【ES笔记02】ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)

朱友斌 2024-01-17 原文

这篇文章,主要介绍ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)。

目录

一、布尔查询

1.1、主键查询

1.2、两种查询方式

(1)路径参数查询

(2)请求体参数查询

1.3、match查询

(1)match

(2)match_all

1.4、过滤字段

1.5、布尔查询(must)

1.6、布尔查询(should)

1.7、布尔查询(must_not)

二、filter过滤查询

2.1、range范围查询

2.2、exists是否存在

2.3、ids过滤查询

2.4、term关键词查询

2.5、terms多关键词查询


一、布尔查询

1.1、主键查询

# 主键查询
GET /索引名称/_doc/doc文档的id

# 测试案例
GET /idx_20221124/_doc/2022001

这种查询方式,每一次只能够查询一条doc文档,如果要查询很多doc文档,那么就需要通过【_search】命令。

1.2、两种查询方式

(1)路径参数查询

将查询条件放在请求路径后面,查询条件使用【q=字段名称:字段值】这种格式,如下所示:

# 单个查询条件
# 查询age字段等于20的doc文档
GET /idx_20221124/_search?q=age:20

(2)请求体参数查询

当查询条件有很多个的时候,如果将所有的查询条件都放在请求路径上面,显然不合适,所以ES可以将查询条件放到请求体里面,请求体里面的查询条件需要按照指定的格式,不然ES会解析报错。

# 
# 查询
GET /idx_20221124/_search
{
  "query": {
    "指定查询类型": {
      "查询字段": "查询值"
    }
  }
}

# 查询
GET /idx_20221124/_search
{
  "query": {
    "match": {
      "age": 20
    }
  }
}

1.3、match查询

match关键字,相当于mysql数据库中的like查询,match查询的字段如果是text类型,那么text会被分词,match就会匹配分词,查询所有包含分词的doc文档,如果不是text类型的,那就是精确查询。

match有多种形式,如下所示:

  • match:查询指定条件的数据,match会将查询的条件进行分词操作,然后只有doc文档中包含分词,就都会查询出来。
  • match_all:查询所有数据。
  • match_phrase:匹配短语,match是会查询所有包含分词的doc文档,而match_phrase则是匹配整个短语,才会返回对应的doc文档。
  • match_phrase_prefix:匹配短语的前缀部分,这个只能使用在text类型字段。

(1)match

# 查询所有数据
# 查询age等于20的doc文档
GET /idx_20221124/_search
{
  "query": {
    "match": {
      "age": 20
    }
  }
}

(2)match_all

match_all表示查询所有的数据,默认是10条,因为ES默认分页是10条数据,这个关键字不能写查询条件。

# 查询所有数据
GET /idx_20221124/_search
{
  "query": {
    "match_all": {}
  }
}

执行结果:

1.4、过滤字段

ES查询时候,默认情况下,会将doc文档中的所有字段都返回,如果查询时候不想查询某个字段,那么可以使用【_source】属性设置查询哪些字段。【_source】就相当于mysql数据库中的【select 字段1,字段2】形式。

【_source】过滤字段:

  • 第一种:_source=false,表示所有字段都不返回。
  • 第二种:_source: ["username", "age"],只返回指定的字段。

案例代码:

# 查询数据,不返回字段
GET /idx_20221124/_search
{
  "query": {
    "match": {
      "age": 20
    }
  },
  "_source": false
}

# 查询数据,返回指定字段
GET /idx_20221124/_search
{
  "query": {
    "match": {
      "age": 20
    }
  },
  "_source": ["username", "age"]
}

执行结果:

1.5、布尔查询(must)

条件查询,和mysql数据库中的条件查询是类似的,只不过ES中使用JSON的方式来组织查询条件,条件查询基本格式如下所示:

# 条件查询数据
GET /索引名称/_search
{
  "query": {
    "bool": {
      "条件类型": [
        {条件1},
        {条件2}
      ]
    }
  }
}

条件查询中的【must】和mysql数据库中的【and】是相同作用,【must】接收一个数组,数组中的所有条件都成立,这个时候才会查询对应数据。

# 查询数据
GET /idx_20221124/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "nickname": "java"
          }
        },
        {
          "match": {
            "age": 25
          }
        }
      ]
    }
  }
}

执行结果:

1.6、布尔查询(should)

既然有and运算,那当然少不了or运算,ES中使用【should】表示或运算,相当于mysql数据库中的【or】连接符。

# 查询数据
GET /idx_20221124/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "nickname": "java"
          }
        },
        {
          "match": {
            "age": 31
          }
        }
      ]
    }
  }
}

执行结果:

1.7、布尔查询(must_not)

must_not是非运算,相当于mysql数据库中的【!】非运算,即:【not】。

# 查询数据
# 查询年龄不是25的所有doc文档
GET /idx_20221124/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "age": 25
          }
        }
      ]
    }
  }
}

执行结果:

二、filter过滤查询

2.1、range范围查询

filter是用于过滤查询的关键字,在filter里面可以使用多种查询条件,例如:range、term、terms、exists、ids几种常见的查询,这里先介绍range范围查询,范围查询首先需要指定范围,下面是几个常见的范围关键字。

range范围关键字:

  • gt:大于。
  • lt:小于。
  • gte:大于等于。
  • lte:小于等于。
  • eq:等于。
  • ne:不等于。

range范围查询的语句格式:

# 查询数据
GET /索引名称/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "指定字段": {
              "条件": 范围值,
              "条件": 范围值
            }
          }
        }
      ]
    }
  }
}

具体案例代码:

# 查询数据
GET /idx_20221124/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gt": 20,
              "lt": 30
            }
          }
        }
      ]
    }
  }
}

执行结果:

2.2、exists是否存在

exists关键字,是表示指定的字段的值是否存在,类似于mysql数据库中的【is null】,但是ES中exists用在filter里面时候,表示过滤掉不存在指定字段的doc文档。

# 查询数据
# 过滤nickname不存在的doc文档数据
GET /idx_20221124/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "exists": {
            "field": "nickname"
          }
        }
      ]
    }
  }
}

运行上面语句之后,会返回所有doc文档中,nickname字段不存在的doc文档结果。

注意:exists会返回指定字段存在的doc文档,只有当字段等于null,即:不存在时候才会匹配成功,如果字段等于空字符串不会匹配成功。

2.3、ids过滤查询

ids查询,这就相当于mysql数据库中的【in】条件查询,多个条件值查询,但是这里的只能够对doc文档的id进行多个值查询。

# 查询数据
# 查询doc文档id等于:2022001、2022005的数据
GET /idx_20221124/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "ids": {
            "values": [
              "2022001", "2022005"
            ]
          }
        }
      ]
    }
  }
}

执行结果:

2.4、term关键词查询

term表示关键字查询,即:判断doc文档里面是否包含给定的term关键字,如果包含,则满足条件,否则不满足。

# 查询数据
GET /索引名称/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "字段名称": "字段值"
          }
        }
      ]
    }
  }
}

# 测试案例
GET /idx_20221124/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "username": "java"
          }
        }
      ]
    }
  }
}

执行结果:

2.5、terms多关键词查询

term每次只能够匹配一个关键字,而terms则允许多个关键字匹配。

# 查询数据
GET /idx_20221124/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "字段名称": [
              "字段值1",
              "字段值2",
              "字段值n"
            ]
          }
        }
      ]
    }
  }
}

# 测试案例
GET /idx_20221124/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "username": [
              "java",
              "python"
            ]
          }
        }
      ]
    }
  }
}

执行结果:

到此,ES中的一些基本查询操作就介绍完啦。

综上,这篇文章结束了,主要介绍ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)。

有关【ES笔记02】ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  8. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  9. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  10. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

随机推荐