【ElasticSearch】query语法

这篇具有很好参考价值的文章主要介绍了【ElasticSearch】query语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍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:文章来源地址https://www.toymoban.com/news/detail-493918.html

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

到了这里,关于【ElasticSearch】query语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • elasticsearch 笔记二:搜索DSL 语法(搜索API、Query DSL)

    从索引 tweet 里面搜索字段 user 为 kimchy 的记录 从索引 tweet,user 里面搜索字段 user 为 kimchy 的记录 从所有索引里面搜索字段 tag 为 wow 的记录 说明:搜索的端点地址可以是多索引多 mapping type 的。搜索的参数可作为 URI 请求参数给出,也可用 request body 给出 URI 搜索方式通过 URI

    2024年02月04日
    浏览(55)
  • es 搜索中同时包含 “query“ 和 “filter“ 子句

    Elasticsearch支持很多查询方式,其中一种就是DSL,它是把请求写在JSON里面,然后进行相关的查询。 一、Query DSL 与 Filter DSL DSL查询语言中存在两种:查询DSL(query DSL)和过滤DSL(filter DSL)。 它们两个的区别如下图: 在查询上下文中,查询会回答这个问题——“ 这个文档匹不

    2024年02月04日
    浏览(46)
  • Elasticsearch Boolean Query查询介绍

    前言 ES 和 Solr 的底层都是基于Apache Lucene 实现,bool 查询的底层实现是Lucene 的 BooleanQuery,其可以组合多个子句查询,类似 SQL 语句里面的 OR 查询。 查询介绍 在 ES 里面 Boolean 查询封装了 4 种 API 接口能力,可以单独使用,也可以组合使用,总结如下: 函数 描述 must query 关键

    2024年02月13日
    浏览(49)
  • Elasticsearch:介绍 kNN query,这是进行 kNN 搜索的专家方法

    作者:来自 Elastic Mayya Sharipova, Benjamin Trent Elasticsearch 中的 kNN 搜索被组织为搜索请求的顶层(top level)部分。 我们这样设计是为了: 无论分片数量多少,它总是可以返回全局 k 个最近邻居 这些全局 k 个结果与其他查询的结果相结合以形成混合搜索 全局 k 结果被传递到聚合

    2024年01月23日
    浏览(41)
  • neo4j查询语言Cypher详解(一)--语法和子句

    neo4j 的图查询语言叫 Cypher 。Cypher的独特之处在于它提供了一种匹配模式和关系的可视化方式。 (nodes)-[:ARE_CONNECTED_TO]-(otherNodes) 使用圆角括号表示节点(nodes), -[:ARROWS]- 表示关系。 Cypher解析器接受任意输入字符串。 unicode 通常可以使用转义 uxxx 。 支持的空白符 描述 Unicode 字

    2024年02月14日
    浏览(55)
  • SQLite学习(七)SQLite的HAVING、DISTINCT、JOIN、UNION子句语法和应用

    在上一篇《SQLite学习(六)SQLite的GLOB、LIMIT、ORDER、GROUP UP子句语法和应用》 中,讲解了 SQLite的GLOB、LIMIT、ORDER、GROUP UP 子句语法,在本篇博客中,将继续讲解 SQLite 子句的基本语法。 同学们将学习到: SQLite HAVING 子句语法 SQLite DISTI

    2024年02月06日
    浏览(38)
  • SQLite学习(六)SQLite的GLOB、LIMIT、ORDER、GROUP UP子句语法和应用

    在上一篇《SQLite学习(五)SQLite的WHERE、AND、OR、LIKE子句语法和应用》 中,讲解了 SQLite中 WHERE、AND、OR、LIKE 子句的语法,在本篇博客中,将继续讲解 SQLite 子句的基本语法。 同学们将学习到: SQLite GLOB 子句语法 SQLite LIMIT 子句语法 SQLite ORDER 子句语法 SQLite GROUP UP 子句语法

    2024年02月06日
    浏览(67)
  • Elasticsearch中倒排索引、分词器、DSL语法使用介绍

    🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝 🍓 更多文章请点击 简介及安装请查看这篇 :Elasticsea

    2024年02月11日
    浏览(49)
  • SQL DELETE 语句:删除表中记录的语法和示例,以及 SQL SELECT TOP、LIMIT、FETCH FIRST 或 ROWNUM 子句的使用

    SQL DELETE 语句用于删除表中的现有记录。 注意 :在删除表中的记录时要小心!请注意DELETE语句中的WHERE子句。WHERE子句指定应删除哪些记录。如果省略WHERE子句,将会删除表中的所有记录! 以下是示例中使用的 Customers 表的一部分: CustomerID CustomerName ContactName Address City Postal

    2024年02月05日
    浏览(81)
  • Elasticsearch:DSL Query

    Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有的数据,一般测试用,例如:match_all,但有分页限制,一次20条左右 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。常见的有两种

    2024年02月10日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包