Elasticsearch核心技术与实战学习笔记 第三章 16 | Request Body与Query DSL简介

一 序

   本文属于极客时间Elasticsearch核心技术与实战学习笔记系列。

其实在高阶使用方法上只有 Request Body Search 才能实现,所以也是推荐使用这种方法查询学习。

二 Request Body Search

Request Body Search 将查询语句通过通过 HTTP 方式发送到 ES,进行查询。

2.1Query DSL

POST /movies,404_idx/_search?ignore_unavailable=true
{
"profile":true,
"query":{
   "match_all" : {}  // 查询所有的文档
}
}

profile:                "type" : "MatchAllDocsQuery",
                "description" : "*:*",

分页:

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

排序:

GET kinaba_sample_data_ecommerce/_search
{
  "sort":[{"order_date":"desc}],
  "from":10,
  "size":5,
   "query":{
   "match_all":{}
}

sort 根据某些字段进行排序,最好选择日期或者数字的列进行排序

_source 当你不需要对所有字段进行查询,通过 _source 选择需要展示数据,不填写则所有,)source 支持正则

#source filtering
POST kibana_sample_data_ecommerce/_search
{
  "_source":["order_date"],//只显示order_date字段
  "query":{
    "match_all": {}
  }
}

2.2 脚本字段

   脚本字段简单说通过 ES 的 painless 脚本去算出一个新的字段。这个有什么用处呢?当你要对一个列排序,发现存储的有不同的单位,需要转换之后才能做一个统一的排序。

#脚本字段
GET kibana_sample_data_ecommerce/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['order_date'].value+'hello'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}

用例:订单中有不同的汇率,需要结合汇率对订单价格进行排序。

脚本字段不要选择文本类型,默认禁止,可以通过设置 fielddata = true 开启,不建议。

2.3Match 查询表达式

前面 URL Search 中讲解 Term 和 Phrase 查询,现在我们来看在 Request Body Search 是怎么实现。

  • 使用 quest-match 方式,下一层填写具体查询内容,
  • 查询内容两个字符串,类似于 OR 方式。
POST movies/_search
{
  "query": {
    "match": {
      "title": "last christmas"
    }
  }
}

相当于 OR ,如果你要要求 Who Last 要同时出现,增加 "operator": "and" 实现。

2.4Match Phrase

  • 通过使用 query-match_phrase 实现 Phrase 查询
  • query 的词必须按照顺序排列
  • slop 实现模糊查询,slop=1,表示中间可以有一个字符
POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love"

      }
    }
  }
}

没有搜索结果。

POST movies/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "Who Christmas",
        "slop": 1
      }
    }
  }
}

小结

URL Search 和 Request Body Search 都可以简单方便查询我们想要的结果, 那么我们应该采用哪种方式进行查询呢?在简单的进行查询两种方式没有什么区别,但是在 ES 中高级使用方法只能在 Request Body Search 中做,所有这里也是推荐学习和使用这种方法。

数据:需导入Movie测试数据,具体参考“2.4-Logstash安装与导入数据”

kibana_sample_data_ecommerce 索引是 kibana 自带的索引,需要手动在 kibana 进行点击导入。

猜你喜欢

转载自blog.csdn.net/bohu83/article/details/106151954