ES-ElasticSearch查询命令

本文介绍了Elasticsearch中使用请求体查询的方式,包括match进行全文搜索,term和terms进行精确匹配,range进行范围查询,以及bool如何组合不同条件进行复杂查询。这些方法类似于SQL的where语句,用于筛选符合条件的文档。
摘要由CSDN通过智能技术生成

根据条件查询符合标准的doc文档,需要使用更进阶的查询方式,在ES中一般采用请求体格式通过**_search**来进行查询,query子句主要用于编写查询条件,类似SQL中的where语句。

# 查询格式
GET /{索引名}/_search
{
  "query": {
    "指定查询类型": {
      "查询字段": "查询值"
    }
  }
}

匹配单个字段

通过match实现全文搜索,如果fieldname字段的数据类型是text类型,搜索querytext关键词会进行分词处理

GET /idx_name/_search
{
    "query": {
        "match" : {
            "fieldname" : "querytext"
        }
    }
}

精确匹配单个字段

使用match方法查询的时候文本中只要带有querytext关键词的就会被检索,如果需要等值匹配需要使用term命令:

GET /idx_name/_search
{
  "query": {
    "term": {
      "fieldname": "termid"
    }
  }
}
# 搜索fieldname = "termid"的文档,sql语句:
select * from idx_name where fieldname = "termid"

精确匹配单个字段的多值

使用terms语句,一个字段包含给定数组中的任意一个值就匹配,相当于sql中的in语句

GET /idx_name/_search
{
  "query": {
    "terms": {
      "fieldname": [ # 单值对应多值的时候使用[],每个值之间使用`,`连接
      	"termid1",
      	"termid2",
      	"termid3"
      ]
    }
  }
}
# 搜索idx_name索引中fieldname字段,只要包含"termid1","termid2","termid3"其中一个值的文档,sql语句为:
select * from idx_name where fieldname in ("termid1", "termid2", "termid3")

范围查询

通过range实现范围查询,类似sql语句中的>,>=, <, <=表达式,一共有四个参数:

  • gt - 大于 ( > )
  • gte - 大于且等于 ( >= )
  • lt - 小于 ( < )
  • lte - 小于且等于 ( <= )
GET /idx_name/_search
{
  "query": {
    "range": {
      "time": { # range语句使用{}包含两个条件
      	"gte": 1679328000000,
        "lte": 1679414400000
      }
    }
  }
}
# 搜索idx_name索引中time字段,1679328000000 <= time <= 1679414400000的文档,sql语句为:
select * from idx_name where time >= 1679328000000 and time <= 1679414400000

bool组合查询

在bool查询中,可以组合多个字段的查询条件,和sql中的andornot相似,它的结构为:

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

must条件

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

# 语法格式
GET /{索引名}/_search
{
  "query": {
    "bool": {
      "must": [
         {匹配条件1},
         {匹配条件2},
         {匹配条件N}
        ]
    }
  }
}

# 示例
GET /idx_name/_search
{
  "query": {
    "bool": {
      "must": [ # must语句用[]包含匹配条件,每个匹配条件之间使用`,`连接
          {
            "term": {
              "fieldname": "termid"
            }
          },
          {
            "range": {
              "time": { # range语句使用{}包含两个条件
                    "gte": 1679328000000,
                    "lte": 1679414400000
              }
            }
          }          
      ]
    }
  }
}
# 搜索idx_name索引中term字段值为termid,并且1679328000000 <= time <= 1679414400000的文档,sql语句为:
select * from idx_name where fieldname = "termid" and time >= 1679328000000 and time <= 1679414400000

must_not条件

类似SQL的not,代表必须剔除的条件。

# 语法格式
GET /{索引名}/_search
{
  "query": {
    "bool": {
      "must_not": [
         {匹配条件1},
         {匹配条件2},
         {匹配条件N}
        ]
    }
  }
}

# 示例
GET /idx_name/_search
{
  "query": {
    "bool": {
      "must_not": [ # must语句用[]包含匹配条件,每个匹配条件之间使用`,`连接
          {
            "terms": {
              "fieldname": [ # 单值对应多值的时候使用[],每个值之间使用`,`连接
                "termid1",
                "termid2",
                "termid3"
              ]
            }
          },
          {
            "range": {
              "time": { # range语句使用{}包含两个条件
                    "gte": 1679328000000,
                    "lte": 1679414400000
              }
            }
          }          
      ]
    }
  }
}
# 搜索idx_name索引中term字段值为"termid1","termid2","termid3",并且1679328000000 <= time <= 1679414400000的以外的文档

should条件

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

# 语法格式
GET /{索引名}/_search
{
  "query": {
    "bool": {
      "should": [
         {匹配条件1},
         {匹配条件2},
         {匹配条件N}
        ]
    }
  }
}

# 示例
GET /idx_name/_search
{
  "query": {
    "bool": {
      "should": [ # must语句用[]包含匹配条件,每个匹配条件之间使用`,`连接
          {
            "match" : {
                "fieldname" : "querytext1"
            }
          },
          {
            "match" : {
                "fieldname" : "querytext2"
            }
          }          
      ]
    }
  }
}
# 搜索idx_name索引中fieldname字段值中包含"querytext1"和"querytext2"的文档,sql语句为:
select * from order_v2 where fieldname="querytext1" or fieldname="querytext2"

bool综合例子

bool中可以包含matchtermtermsrangebool

GET /order_v2/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [ # 注意叠层"must"、"must_not"、"should"上层为"bool",匹配条件用[]包含。
              {
                "term": {
              		"fieldname": "termid"
            	}
              },
              {
                "range": {
                  "time": { # range语句使用{}包含两个条件
                    "gte": 1679328000000,
                    "lte": 1679414400000
              	  }
                }
              }
            ]
          }
        },
        {
          "terms": { # 单值对应多值的时候使用[],每个值之间使用`,`连接
            "tag": [
              1,
              2,
              3,
              4,
              5,
              12
            ]
          }
        }
      ]
    }
  }
}
# sql语句:
select * from order_v2 where (fieldname = 'termid' and (time>=1679328000000 and time<=1679414400000)) or tag in (1,2,3,4,5)
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 Elasticsearch SQL 插件,您需要先确保您已经安装了 Elasticsearch 7.1.1 版本。然后,按照以下步骤进行操作: 1. 安装 Elasticsearch SQL 插件: - 打开终端或命令提示符窗口。 - 运行以下命令安装 Elasticsearch SQL 插件: ``` ./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/7.1.1.0/elasticsearch-sql-7.1.1.0.zip ``` - 安装完成后,重启 Elasticsearch 以使插件生效。 2. 使用 Elasticsearch SQL: - 打开终端或命令提示符窗口。 - 进入 Elasticsearch 的安装目录。 - 运行以下命令以启动 Elasticsearch SQL 查询: ``` ./bin/elasticsearch-sql-cli ``` - 您将进入 Elasticsearch SQL 的命令行界面。 - 现在,您可以开始使用 SQL 语法来查询 Elasticsearch 数据。 例如,您可以运行以下命令来执行一个简单的 SELECT 查询: ``` SELECT * FROM your_index_name WHERE your_field_name = 'your_value' ``` 注意:在上述查询中,`your_index_name` 是您要查询的索引名称,`your_field_name` 是您要查询的字段名称,`your_value` 是您要匹配的字段值。 这样,您就可以使用 Elasticsearch SQL 插件来执行 SQL 查询并检索 Elasticsearch 中的数据了。请记住,Elasticsearch SQL 插件提供了一种方便的方式来使用 SQL 语法进行查询,但它可能不适用于所有类型的查询,特别是复杂的查询。因此,在使用插件时,请确保您了解其使用限制和适用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值