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