0


ES-ElasticSearch查询命令

根据条件查询符合标准的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中的

and

or

not

相似,它的结构为:

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

中可以包含

match

term

terms

range

bool

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)

本文转载自: https://blog.csdn.net/qq_42078712/article/details/129820615
版权归原作者 理不为 所有, 如有侵权,请联系我们删除。

“ES-ElasticSearch查询命令”的评论:

还没有评论