Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)

本文介绍了Elasticsearch7.x中的Search API,重点讲解了Request Body Search和DSL查询。内容包括分页、排序、_source过滤、脚本字段、match表达式以及短语查询等基本语法。示例中展示了如何实现分页、按字段排序、筛选查询结果以及使用脚本字段进行计算。同时,对比了query string和simple query string的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Elasticsearch建议我们尽量使用Request Body查询的方式,这种方式支持的语法更丰富。

常用语法

     先来看一个简单的例子。这个例子会查询两个索引(movies和404_idx)的全部文档。理论上,如果404_idx索引不存在,Elasticsearch将返回错误。但是,由于ignore_unavailable参数的缘故,执行将忽略不可用的索引。

# ignore_unavailable=true,可以忽略尝试访问不存在的索引“404_idx”导致的报错
POST /movies,404_idx/_search?ignore_unavailable=true
{
    "profile": true,
    "query": {
        "match_all": {}
    }
}

 1 from / size分页

    我们还可以使用 from / size 组合来实现分页。

POST /movies/_search
{
  "from": 0,
  "size": 20, 
  "query": {
    "match_all": {}
  }
}

2 sort排序

     使用sort来实现排序。如果需要像sql语句一样对多个字段排序,可以在sort里面传入多个元素。

POST /movies/_search
{
  "sort": [{"year": {"order": "desc"}},
          {"id.keyword": {"order": "desc"}} ],
  "from": 0,
  "size": 20, 
  "query": {
    "match_all": {}
  }
}

3 _source 过滤

 Elasticsearch查询的结果过多,会影响执行的效率。因此,我们可以通过_source过滤的方式来减少查询的字段。

  如下查询只显示 title属性

POST /movies/_search
{
  "sort": [{"year": {"order": "desc"}},
          {"id.keyword": {"order": "desc"}} ],
  "from": 0,
  "size": 20, 
  "_source": ["title"], 
  "query": {
    "match_all": {}
  }
}

4 脚本字段

  Elasticsearch还支持painless脚本字段,这种机制可以通过脚本的方式做一些简单的操作,比如:字符串拼接。在订单场景,订单有不同的汇率信息,通过脚本计算,我们可以针对计算的结果排序。

  

POST /movies/_search
{
  "sort": [{"year": {"order": "desc"}},
          {"id.keyword": {"order": "desc"}} ],
  "from": 0,
  "size": 20, 
  "query": {
    "match_all": {}
  }
  , "script_fields": {
    "new_title": {
      "script": {
        "lang": "painless",
         "source": "doc['year'].value+'hello'"
      }
    }
  }
}

5 match 表达式语句

 1) query match中,查询的内容默认是OR的方式。如下所示:

POST /movies/_search
{
  "query": {
    "match": {
      "title": "last christmas"
    }
  }
}

 2) 如果要使用AND的方式,可通过指定operator为and来实现。

POST /movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "last christmas",
        "operator": "and"
      }
      
    }
  }

6 短语查询 

   使用短语查询的方式。即:phrase query。默认短语中间不能有间隔,但是可使用slop=1来表示中间可以间隔一个term(单词)

POST /movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
         "query": "one love",
         "slop": 1
      }
    }
  }
}

二 Query string && Simple query string

    1 Elasticsearch还支持query string和simple query string。先来看看query string,这种方式支持分组和多字段。

 首先插入两条测试数据

PUT /users/_doc/1
{
  "name":"Ruan Yiming",
  "about":"java, golang, node, swift, elasticsearch"
}

PUT /users/_doc/2
{
  "name":"Li Yiming",
  "about":"Hadoop"
}

测试:

POST /users/_search
{
  "query": {
    "query_string": {
      "default_field": "name",
      "query": "Ruan AND Yiming"
    }
  }
}

# 多字段 使用 fields
POST /users/_search
{
  "query": {
    "query_string": {
      "fields": ["name","about"], 
      "query": "(Ruan AND Yiming) OR (Java AND Elasticsearch)"
    }
  }
}

simple query string,类似于query string,但是有以下不同:

  1. 会忽略错误的语法,且只支持部分查询语法
  2. 不支持ANDORNOT,如果出现这些term,将被当做字符串处理
  3. term之间默认的关系是OR,可指定default_operator
  4. 支持部分逻辑,+代替AND|代替OR-代替NOT
POST users/_search
{
    "query": {
        "simple_query_string": {
            "query": "Zhang Fubing",
            "fields": ["name"],
            "default_operator": "AND"
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值