elasticsearch Request Body 与 Query DSL详解


1. Request Body Search(query.match_all)

  • 将查询语句通过 HTTP Request Body 发送给 Elasticsearch
  • Query DSL
POST /movies,404_idx/_search?ignore_unavailable=true
{
  "profile": "true",
  "query": {
    "match_all": {}
  }
}
//返回全部

空查询(empty search) —{}— 在功能上等价于使用 match_all 查询, 正如其名字一样,匹配所有文档。在没有指定查询方式时,它是默认的查询:. { "match_all": {}}. 拷贝为cURL在Sense 中查看. 它经常与filter 结合使用

1.1 分页

  • From 从 0 开始 默认返回 10 个结果
  • 获取靠后的翻页,成本较高
POST /kibana_sample_data_ecommerce/_search
{
  "from":10,
  "size":20,
  "query": {
    "match_all":{}
  }
}

1.2 排序

  • 最好在 “数字型” 与 “日期型” 字段上排序
  • 因为对于多值类型或分析过的字段排序,系统会选一个值,无法得知该值
POST /kibana_sample_data_ecommerce/_search
{
  "sort":[{"order_date":"desc"}],
  "from":10,
  "size":20,
  "query": {
    "match_all":{}
  }
}
//返回10个并按照日期排序

1.3 _source 过滤

  • 如果_source 没有存储,那就只返回匹配的文档元数据
  • _source 支持使用通配符
  • _source[“name* “,”desc*”]
GET /kibana_sample_data_ecommerce/_search
{
  "_source": ["order_date","order_date","category.keyword"],
  "from":10,
  "size":20,
  "query": {
    "match_all":{}
  }
}
//返回_source含有"order_date","order_date","category.keyword"的值
例如
{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4675,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "kibana_sample_data_ecommerce",
        "_type" : "_doc",
        "_id" : "EFGvgnUBh8v6HnS077dk",
        "_score" : 1.0,
        "_source" : {
          "order_date" : "2020-10-30T16:29:17+00:00"
        }
      },

1.4 脚本字段

  • 能算出新的字段
  • 用例:订单中有不同的汇率,需要结合汇率对订单价格进行排序
 #脚本字段
GET kibana_sample_data_ecommerce/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['order_date'].value+'hello'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}

1.5 使用查询表达式 - Match(query.match)

POST movies/_search
{
  "query": {
    "match": {
      "title": "Last Christmas"  // 相当于 OR 可出现其中1个
    }
  }
}

POST movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Last Christmas",
        "operator": "AND"             //相当于 and 只能两个都出现
      }
    }
  }
}

1.6 短语搜索 - Match Phrase(query.match_phrase)

POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love"

      }
    }
  }
}
返回0

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

1.7 query.query_string

  • 类似 URI Query – 把查询条件放在 POST 里面
//准备工作
  PUT /users/_doc/3
  {
    "name" : "Li Sunke",
    "about": "php,elasticsearch,redis,nginx,swoole"
  }

  PUT /users/_doc/4
  {
    "name" : "Qu Sunke",
    "about": "mysql,php"
  }
  //query_string
  POST /users/_search
  {
    "query": {
      "query_string": {
        "query": "Li AND Sunke",
        "default_field": "name"
      }
    }
  }
  //返回1个结果
  "hits" : [
        {
          "_index" : "users",
          "_type" : "_doc",
          "_id" : "3",
          "_score" : 0.87546873,
          "_source" : {
            "name" : "Li Sunke",
            "about" : "php,elasticsearch,redis,nginx,swoole"
          }
        }
      ]
  //query string 支持分组查询多个字段
  // 返回 doc_3
  POST /users/_search
  {
    "query": {
      "query_string": {
        "fields": ["name","about"],
        "query": "(Li AND Sunke) OR (php AND nginx)"
      }
    }
  }
  返回一个结果
  "hits" : [
      {
        "_index" : "users",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.9899296,
        "_source" : {
          "name" : "Li Sunke",
          "about" : "php,elasticsearch,redis,nginx,swoole"
        }
      }
    ]

1.8 query.simple_query_string

  • 类似 Query String , 但是会忽略错误的语法同时只支持部分查询语句

  • 不支持 AND OR NOT , 但会当作字符串处理

  • Term 之间默认的关系是 OR, 可以指定 Operator

  • 支持 部分逻辑

  • ·替代 AND

  • | 替代 OR

  • -替代 NOT

// Simple Query 默认的operator 是 Or
// AND 会当做一个字符串,所以会 3个字段OR查询

POST /users/_search
{
"query": {
 "simple_query_string": {
   "query": "Li  AND Sunke", 
   "fields": ["name"],
 }
}
}
//返回两个

POST /users/_search
{
"query": {
 "simple_query_string": {
   "query": "Li  AND Sunke", 
   "fields": ["name"],
   "default_operator": "AND"
 }
}
}
//返回0个



POST /users/_search
{
"query": {
"simple_query_string": {
"query": "Li Sunke",
"fields": ["name"],
"default_operator": "AND"
}
}
}
//返回1个

参考资料:
极客时间:Elasticsearch核心技术与实战
相关阅读:
初学elasticsearch入门
Elasticsearch本地安装与简单配置
docker-compose安装elasticsearch集群
Elasticsearch 7.X之文档、索引、REST API详解
Elasticsearch节点,集群,分片及副本详解
Elasticsearch倒排索引介绍
elasticsearch Analyzer 进行分词详解
elasticsearch search API详解
Elasticsearch URI Search 查询方法详解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ghostwritten

口渴,请赏一杯下午茶吧

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

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

打赏作者

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

抵扣说明:

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

余额充值