【ElasticSearch】query语法

news/2024/7/7 5:52:30 标签: elasticsearch

介绍ES 的query子句的语法,query子句主要用于编写查询条件,类似SQL中的where语句。

query子句主要用来编写类似SQL的Where语句,支持布尔查询(and/or)、IN、全文搜索、模糊匹配、范围查询(大于小于)。

text类型字段支持分词,可以使用模糊查询
keyword类型只能做等值查询,不能进行分词

1.匹配单个字段

通过match实现全文搜索,全文搜索的后面有单独的章节讲解,这里大家只要知道简单的用法就可以。

语法:

GET /{索引名}/_search
{
  "query": {
    "match": {
      "{FIELD}": "{TEXT}"
    }
  }
}

说明:
{FIELD} - 就是我们需要匹配的字段名
{TEXT} - 就是我们需要匹配的内容
例子:

GET /article/_search
{
    "query": {
        "match" : {
            "title" : "ES教程"
        }
    }
}

article索引中,title字段匹配ES教程的所有文档。
如果title字段的数据类型是text类型,搜索关键词会进行分词处理。

**

2.精确匹配单个字段

**
如果我们想要类似SQL语句中的等值匹配,不需要进行分词处理,例如:订单号、手机号、时间字段,不需要分值处理,只要精确匹配。

通过term实现精确匹配语法:

GET /{索引名}/_search
{
  "query": {
    "term": {
      "{FIELD}": "{VALUE}"
    }
  }
}

说明:

{FIELD} - 就是我们需要匹配的字段名
{VALUE} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。
例子:

GET /order_v2/_search
{
  "query": {
    "term": {
      "order_no": "202003131209120999"
    }
  }
}

搜索订单号order_no = "202003131209120999"的文档。

类似SQL语句:

select * from order_v2 where order_no = "202003131209120999"

3.通过terms实现SQL的in语句

如果我们要实现SQL中的in语句,一个字段包含给定数组中的任意一个值就匹配。

terms语法:

GET /order_v2/_search
{
  "query": {
    "terms": {
      "{FIELD}": [
        "{VALUE1}",
        "{VALUE2}"
      ]
    }
  }
}

说明:

{FIELD} - 就是我们需要匹配的字段名
{VALUE1}, {VALUE2} … {VALUE N} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。
例子:

GET /order_v2/_search
{
  "query": {
    "terms": {
      "shop_id": [123,100,300]
    }
  }
}

搜索order_v2索引中,shop_id字段,只要包含[123,100,300]其中一个值,就算匹配。

类似SQL语句:

select * from order_v2 where shop_id in (123,100,300)

**

4.范围查询

**
通过range实现范围查询,类似SQL语句中的>, >=, <, <=表达式。

range语法:

GET /{索引名}/_search
{
  "query": {
    "range": {
      "{FIELD}": {
        "gte": 10, 
        "lte": 20
      }
    }
  }
}

参数说明:

{FIELD} - 字段名
gte范围参数 - 等价于>=
lte范围参数 - 等价于 <=
范围参数可以只写一个,例如:仅保留 “gte”: 10, 则代表 FIELD字段 >= 10
范围参数如下:

gt - 大于 ( > )
gte - 大于且等于 ( >= )
lt - 小于 ( < )
lte - 小于且等于 ( <= )

例子1:

GET /order_v2/_search
{
  "query": {
    "range": {
      "shop_id": {
        "gte": 10,
        "lte": 200
      }
    }
  }
}

查询order_v2索引中,shop_id >= 10 且 shop_id <= 200的文档

类似SQL:

select * from order_v2 where shop_id >= 10 and shop_id <= 200

例子2:

GET /order_v2/_search
{
  "query": {
    "range": {
      "shop_id": {
        "gte": 10      
       }
    }
  }
}

类似SQL:

select * from order_v2 where shop_id >= 10

**

5.bool组合查询

**
前面的例子都是设置单个字段的查询条件,如果需要编写类似SQL的Where语句,组合多个字段的查询条件,可以使用bool语句。

5.1. bool查询基本语法结构

在ES中bool查询就是用来组合布尔查询条件,布尔查询条件,就是类似SQL中的and (且)、or (或)。

在SQL中,我们需要and和or,还有括号来组合查询条件,在ES中使用bool查询可用做到同样的效果。

bool语法结构:

GET /{索引名}/_search
{
  "query": {
    "bool": { // bool查询
      "must": [], // must条件,类似SQL中的and, 代表必须匹配条件
      "must_not": [], // must_not条件,跟must相反,必须不匹配条件
      "should": [] // should条件,类似SQL中or, 代表匹配其中一个条件
    }
  }
}

可以任意选择must、must_not和should条件的参数都是一个数组,意味着他们都支持设置多个条件。

提示:前面介绍的单个字段的匹配语句,都可以用在bool查询语句中进行组合。

5.2. must条件

类似SQL的and,代表必须匹配的条件。

语法:

GET /{索引名}/_search
{
  "query": {
    "bool": {
      "must": [
         {匹配条件1},
         {匹配条件2},
         ...可以有N个匹配条件...
        ]
    }
  }
}

例子1:

GET /order_v2/_search
{
  "query": {
    "bool": {
      "must": [
          {
            "term": {
              "order_no":  "202003131209120999"
            }
          },
          {
            "term": {
              "shop_id":  123
            }
          }
        ]
    }
  }
}

这里的Must条件,使用了term精确匹配。

等价SQL:

select * from order_v2 where order_no="202003131209120999" and shop_id=123

5.3. must_not条件

跟must的作用相反。

语法:

GET /{索引名}/_search
{
  "query": {
    "bool": {
      "must_not": [
         {匹配条件1},
         {匹配条件2},
         ...可以有N个匹配条件...
        ]
    }
  }
}

例子:

GET /order_v2/_search
{
  "query": {
    "bool": {
      "must_not": [
          {
            "term": {
              "shop_id": 1
            }
          },
          {
            "term": {
              "shop_id":  2
            }
          }
        ]
    }
  }
}

等价sql:

select * from order_v2 where shop_id != 1 and shop_id != 2

5.3. should条件

类似SQL中的 or, 只要匹配其中一个条件即可

语法:

GET /{索引名}/_search
 {
   "query": {
     "bool": {
       "should": [
          {匹配条件1},
          {匹配条件2},
          …可以有N个匹配条件…
         ]
     }
   }
 }

例子:

GET /order_v2/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "order_no": "202003131209120999"
          }
        },
        {
          "match": {
            "order_no": "22222222222222222"
          }
        }
      ]
    }
  }
}

等价SQL:

select * from order_v2 where order_no="202003131209120999" or order_no="22222222222222222"

5.4. bool综合例子

GET /order_v2/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "order_no": "2020031312091209991"
                }
              },
              {
                "range": {
                  "shop_id": {
                    "gte": 10,
                    "lte": 200
                  }
                }
              }
            ]
          }
        },
        {
          "terms": {
            "tag": [
              1,
              2,
              3,
              4,
              5,
              12
            ]
          }
        }
      ]
    }
  }
}

等价SQL:

select * from order_v2 where (order_no='202003131209120999' and (shop_id>=10 and shop_id<=200)) or tag in (1,2,3,4,5)

http://www.niftyadmin.cn/n/447960.html

相关文章

数电复习提纲

适用于康华光版教材&#xff0c;按照讲课顺序编写&#xff0c;是根据课堂上重点的回忆&#xff0c;没有插图&#xff0c;供回忆结构使用 进制 需要熟练掌握十进制和二进制、八进制、十六进制直接的转换 其中二进制、八进制和十六进制有特殊的规律&#xff1a;&#xff08;二转…

JavaWeb小记——Servlet

目录 Servlet概念 Servlet快速入门 1.创建web项目 2.创建一个Java类&#xff0c;实现Servlet接口 3.重写接口中的service()方法 4.配置Servlet——web.xml中 5.发布项目 6.发送请求&#xff0c;请求Servlet Servlet原理 Servlet的生命周期 1.init() 2.service() 3.…

Qt简单讲解项目结构

Qt简单讲解项目结构 项目结构 主函数入口 #include "mainwindow.h"#include <QApplication>// 程序入口 argc 表示命令行变量的数量 argv表示命令行变量的数组 int main(int argc, char *argv[]) {// a表示应用程序对象QApplication a(argc, argv);MainWin…

Doo Prime 德璞资本:你不能不知道的贵金属期货交易平台选取方法!

近些年来&#xff0c;在贵金属期货交易市场中&#xff0c;投资者越来越多。随着贵金属价格的波动&#xff0c;期货交易成为了一种非常有吸引力的投资方式。然而做期货交易&#xff0c;怎么选一家好的贵金属期货交易平台&#xff0c;成为了许多期货投资者非常关心的问题。 首先&…

网络安全加固的五大手段!

网络安全加固是一种全面的方法&#xff0c;可以保护组织免受入侵者的攻击&#xff0c;并降低风险&#xff0c;同时通过缩小攻击面&#xff0c;减少薄弱环节。 加固&#xff08;或系统加固&#xff09;考虑到了攻击者为闯入系统而可能觊觎的所有漏洞和入口点。虽然力求创新、下定…

2023年智能优化算法之——增长优化器Growth Optimizer(GO),附MATLAB代码

增长优化器的主要设计灵感来源于个人在社会成长过程中的学习和反思机制。学习是个体通过从外部世界获得知识而成长的过程。反思是检查个人自身不足并调整个人学习策略以帮助个人成长的过程。参考文献如下&#xff1a; Zhang, Qingke, et al. “Growth Optimizer: A Powerful M…

论文解读:Splicing ViT Features for Semantic Appearance Transfer

Project webpage: https://splice-vit.github.io Abstruct 将两张图片中语义相近的目标的结构和风格&#xff08;外观&#xff09;拼接 • 输入一个 Structure/ Appearence 图像对 &#xff1a; 训练生成器 。 • 关键思想是利用 预训练 和固定的视觉转换器 ( ViT ) 模型&…

加壳与脱壳,打造铁壁铜墙的Android应用防护境地

加壳和脱壳是什么&#xff1f; Android逆向加壳和脱壳是与Android应用程序安全相关的概念。 逆向加壳&#xff08;Reverse Engineering with Packing&#xff09;&#xff1a;逆向加壳是指在给定的Android应用程序中&#xff0c;通过添加一个或多个防护层或加密算法来增加应用…