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中的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)

猜你喜欢

转载自blog.csdn.net/qq_42078712/article/details/129820615