elasticsearch查询搜索命令大全

查询简介

叶子查询子句

叶子查询子句在特定字段中查找特定值,例如match,term或range查询。 这些查询可以自己使用。

复合查询子句

复合查询子句包装其他叶查询或复合查询,并用于以逻辑方式组合多个查询(例如bool或dis_max查询),或更改其行为(例如constant_score查询)。复合查询子句包含以下几种:

  • bool query
  • boosting query
  • constant_score query
  • dis_max query
  • function_score query

我们通常只会用到bool查询

查询子句的行为会有所不同,具体取决于它们是在查询上下文中(Query)还是在过滤器(Filter)上下文中使用。

 

1、term和terms

terms相关于sql里的In

term后面的value,不能是数组,只能是一个值,否则会报错。比如 {"term":{"age":"80后"}}

terms后面的value,必须是数组,不能是一个值,否则会报错,比如 {"term":{"age":["80后"]}}

term和terms等查询,不会对查询对字段进行分词处理,适合于date、num、id等确切数据进行搜索

例如:age字段包含的值为80后、90后。使用term查询,{"term":{"age":"80后"}} 这样是无法查询到age是"80后"的数据的,因为term不会对"80后"进行分词,而es中存储的age字段,会把"80后"分成“80”和“后”,没有“80后”,所以使用term无法查询到

es会对中文,-等组成的字符串自动分词

解决此问题需要使用keyword

{"term":{"age.keyword":"80后"}}

# 查询age为39的所有记录
POST /bank/_search?pretty
{  "query": {"term": { "age": 39  }  }}
# terms后的values值,如果是数组的话,是或的关系,不是且的关系。
# 以下示例为查询property_newOrOldExtent,可能是10,或者8,或者5...的数据
{"terms":{"property_newOrOldExtent":[10,8,5,3,0]}}

 

must

相当于sql里的and

出现于匹配查询当中,有助于匹配度(_score)的计算

 

must_not

相当于sql里的not

满足的内容不会出现,与filter功能相反,属于过滤,不会影响分值的计算,但是会过滤掉不符合的数据

 

shoud

相当于sql里的or

该条件下的内容是应该满足的内容,如果符合会增加分值,不符合降低分值,不会不显示

shoud_not

 

filter

必须满足才能出现,属于过滤,不会影响分值的计算,但是会过滤掉不符合的数据

 

2、match

match的所有方法,都会对字段进行分词,所查询的字段数据只要包含分词后结果的一个,就会被查询到

 

match_phrase:短语匹配查询,必须匹配短语中的所有分词,并且保证各个分词的相对位置不变

multi_match:查询多个字段包含某个关键词的数据

# 查询content或education中含有"大学"的数据
GET index_1/_search
 
{
  "query": {
    "bool": {
      "filter": {
        "multi_match": {
          "query": "大学",
          "fields": ["content", "education"]
        }
      }
    }
  }

 

match_all:查询所有文档

GET index_1/_search { "query": { "match_all": {} }

 

3、range

range范围查找,查找某一范围的所有数据

gt:大于

gte:大于等于

lt:小于

lte:小于等于

# 查询时间大于等于2019-08-10 10:08:29,小于等于2019-08-13 10:08:29的数据
GET index_4/_search
 
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "date": {
            "gte": "2019-08-10 10:08:29", 
            "lte": "2019-08-13 10:08:29"
          }    
        }
      }
    }
  }

 

4、sort

sort按照某些字段对数据进行排序,可以是一个字段,也可以是多个字段

desc:降序

asc:生序

# 查询数据按照时间的降序排列
GET index_1/_search
 
{
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    }
  ], 
  "query": {
    "match_all": {}
  }

5、_source

对于搜索的结果,只关注某些字段的值

# 查询所有的数据的name和age
GET index_1/_search
 
{
  "_source": ["name", "age"], 
  "query": {
    "match_all": {}
  }

 

 

6、from和size

from:从某个位置开始查询,最小为0,某些情况下可以为-1(下一篇说明)

size:查询长度

from+size不能大于10000,否则es会报错(下一篇解决)

# 查询前20条数据,并按照date的降序排列
GET index_1/_search
 
{
  "from": 0,
  "size": 20, 
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    }
  ], 
  "query": {
    "match_all": {}
  }
}

 

7、fuzzy

模糊匹配

8、wildcard

通配符查询

 

 

 

must的两个条件都必须满足,should中的两个条件至少满足一个就可以。

 

 

综合示例

 

GET idx_pro/_search
{
  "query": {
    "bool": {
      "must": [
        {    
          "match": {
            "name": "花花公子羽绒服"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "proId": 6
          }
        }
      ], 
      "should": [
        {
          "terms": {
            "name.keyword": ["花花公子暖心羽绒服", "花花公子外套"]
          }
        }
      ], 
      "filter": {
        "range": {
          "createTime": {
            "gte": "2019-12-12 17:56:56",
            "lte": "2019-12-19 17:56:56",
            "format": "yyyy-MM-dd HH:mm:ss"
          }
        }
      }
    }
  }
}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当代码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值