Elasticsearch查询语法(二)

袁志蒙 1902次浏览

摘要:本文介绍ES的query子句的语法,query子句主要用于编写查询条件,类似SQL中的where语句,匹配单个字段,通过match实现全文搜索,全文搜索后面在单独介绍...

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

一、匹配单个字段

通过 match 实现全文搜索,全文搜索后面在单独介绍,这里指的是简单的用法:

POST /{索引名}/_search
{
  "query": {
    "match": {
      "{FIELD}": "{TEXT}"
    }
  }
}

{FIELD} - 就是我们需要匹配的字段名

{TEXT} - 就是我们需要匹配的内容

如果 {FIELD} 字段的数据类型是text类型,搜索关键词会进行分词处理。

二、精确匹配单个字段

如果我们想要类似SQL语句中的等值匹配,不需要进行分词处理,例如:订单号、手机号、时间字段,不需要分值处理,只要精确匹配。通过 term 实现精确匹配语法:

POST /{索引名}/_search
{
  "query": {
    "term": {
      "{FIELD}": "{VALUE}"
    }
  }
}

{FIELD} - 就是我们需要匹配的字段名

{VALUE} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。

类似SQL语句:

select * from table_name where title = "yzmcms"

三、通过terms实现SQL的IN语句

如果我们要实现SQL中的in语句,一个字段包含给定数组中的任意一个值就匹配:

POST /{索引名}/_search
{
  "query": {
    "terms": {
      "{FIELD}": [
        "{VALUE1}",
        "{VALUE2}"
      ]
    }
  }
}

{FIELD} - 就是我们需要匹配的字段名

{VALUE1}, {VALUE2} .... {VALUE N} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。

类似SQL语句:

select * from table_name where {FIELD} in ({VALUE1},{VALUE2})

四、范围查询

通过 range 实现范围查询,类似SQL语句中的>, >=, <, <=表达式:

POST /{索引名}/_search
{
  "query": {
    "range": {
      "{FIELD}": {
        "gte": 10, 
        "lte": 20
      }
    }
  }
}

{FIELD} - 字段名

gte范围参数 - 等价于 >=

gt范围参数 - 等价于 >

lte范围参数 - 等价于 <=

lt范围参数 - 等价于 <

范围参数可以只写一个,例如:仅保留 "gte": 10, 则代表 FIELD字段 >= 10

类似SQL:

select * from table_name where id >= 10 and id <= 20

五、bool组合查询

前面的例子都是设置单个字段的查询条件,如果需要编写类似SQL的Where语句,组合多个字段的查询条件,可以使用bool语句。

在ES中bool查询就是用来组合布尔查询条件,布尔查询条件,就是类似SQL中的and (且)、or (或),在SQL中,我们需要and和or,还有括号来组合查询条件,在ES中使用bool查询可用做到同样的效果。

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

可以任意选择must、must_not和should条件的参数都是一个数组,意味着他们都支持设置多个条件。

must条件

POST /{索引名}/_search
{
  "query": {
    "bool": {
      "must": [
         {匹配条件1},
         {匹配条件2},
         ...可以有N个匹配条件...
        ]
    }
  }
}

例子:

POST /order/_search
{
  "query": {
    "bool": {
      "must": [
          {
            "term": {
              "order_no":  "202201012356"
            }
          },
          {
            "term": {
              "shop_id":  123
            }
          }
        ]
    }
  }
}

等价SQL:

select * from order where order_no="202201012356" and shop_id=123

must_not条件

POST /{索引名}/_search
{
  "query": {
    "bool": {
      "must_not": [
         {匹配条件1},
         {匹配条件2},
         ...可以有N个匹配条件...
        ]
    }
  }
}

例子:

POST /order/_search
{
  "query": {
    "bool": {
      "must_not": [
          {
            "term": {
              "shop_id": 1
            }
          },
          {
            "term": {
              "shop_id":  2
            }
          }
        ]
    }
  }
}

等价SQL:

select * from order where shop_id != 1 and shop_id != 2

should条件

POST /{索引名}/_search
{
	"query": {
		"bool": {
			"should": [
				{匹配条件1},
				{匹配条件2},
				…可以有N个匹配条件…
			]
		}
	}
}

例子:

POST /order/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "order_no": "202201012355"
          }
        },
        {
          "match": {
            "order_no": "202201012356"
          }
        }
      ]
    }
  }
}

等价SQL:

select * from order where order_no="202201012355" or order_no="202201012356"

bool综合例子:

POST /order/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "order_no": "20220101789"
                }
              },
              {
                "range": {
                  "shop_id": {
                    "gte": 10,
                    "lte": 20
                  }
                }
              }
            ]
          }
        },
        {
          "terms": {
            "typeid": [
              1,
              2,
              3
            ]
          }
        }
      ]
    }
  }
}

等价SQL:

select * from order where (order_no='20220101789' and (shop_id>=10 and shop_id<=20)) or typeid in (1,2,3)


随机内容

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~