首页 > 其他分享 >Elasticsearch query查询语法

Elasticsearch query查询语法

时间:2024-05-06 14:24:24浏览次数:15  
标签:shop 匹配 语法 Elasticsearch SQL query bool order

Elasticsearch query查询语法


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

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)

 

标签:shop,匹配,语法,Elasticsearch,SQL,query,bool,order
From: https://www.cnblogs.com/muyi-yang/p/18174937

相关文章

  • Elasticsearch 全文搜索
    Elasticsearch全文搜索全文搜索是ES的关键特性之一,平时我们使用SQL的like语句,搜索一些文本、字符串是否包含指定的关键词,但是如果两篇文章,都包含我们的关键词,具体那篇文章内容的相关度更高?这个SQL的like语句是做不到的,更别说like语句的性能问题了。ES通过分词处理、相关度计......
  • day31-jQuery
    1、jQuery介绍jQuery是什么jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“writeLess,DoMore”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计......
  • 第一章 Java基础语法
    1-1环境搭建+入门   ......
  • linux的shell脚本和基本语法
    一、特殊变量$n(n代表0以上的正整数,代表参数位)$?脚本执行状态,0代表执行成功,其他值代表执行失败。$#获取传入参数的个数,常用于循环$*所有的参数视为一个整体$@代表所有参数,每个参数分隔开二、运算符i=[(1+1)*2-5/2]三、条件判断testcondition[condition]"[......
  • 使用-PHP-和-jQuery-构建游戏化-Web-站点(全)
    使用PHP和jQuery构建游戏化Web站点(全)原文:zh.annas-archive.org/md5/a9c92181e14a72b81ed3a8d14d6790a1译者:飞龙协议:CCBY-NC-SA4.0前言几年前,如果你对某人说“游戏化”,你会得到一个奇怪的表情,好像你在编造一些新东西。也许你会得到一个快速的跟进问题:“嗯?那是什么?”......
  • es6语法总结
    ES6常用语法总结​ ECMAScript6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript2015。也就是说,ES6就是ES2015。虽然目前并不是所有浏览器都能兼容ES6全部特性,但越来越多的程序员在实际项目当中已经开始使用ES6了。【1】let和c......
  • Bash脚本语法解析(典例精讲)
    参考资料:https://github.com/AUTOMATIC1111/stable-diffusion-webuihttps://razeen.me/posts/the-ultimate-programmers-guide-to-bash-scripting/众所周知.sh文件是Linux系统中的脚本文件。(与之相对的还有windows系统上对应cmd的bat文件,对应powershell的ps1文......
  • 史上最全shell脚本编程语法上册
    1.shell脚本语言的基本用法1.1shell脚本的用途将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率;减少手工命令的输入,一定程度上避免人为错误;将软件或应用的安装及配置实现标准化;用于实现日常性的,重复性的,非交互式的运维工作,如:文件打包压缩备份,监控系统运......
  • 03.Java 基础语法
    1.注释、标识符、关键字三种注释单行注释://多行注释:/*多行注释*/文档注释:/***@DescriptionHelloWorld*@Authorxxx*/标识符关键字Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符2.数据类型强类型语言:要求变量的使用严格符合规定,......
  • Elasticsearch搜索
    框架概述一个主流的搜索框架业务需求需要模糊搜索数据库里多张表的所有数据技术选型和架构设计在服务器中安装Elasticsearch中间件,在java项目中引入对应jar包,调用jar包中的API将mysql的数据同步到Elasticsearch,最后使用jar包中的API调用Elasticsearch的增删改及搜索服务。版......