前面说的URI的搜索方式,实际上我们开发中不是很常用,我们更常用的是一种叫做request body的查询方式,也就是DSL查询语句。

一、Request Body Search

这种方式也就是DSL,其操作就是把查询语句通过HTTP Request Body发送方给ES,很多高阶使用方法只能在DSL中使用。

1、基本语法

基本查询

POST /movies/_search?ignore_unavailable=true
{"profile": "true","query": {"match_all": {}}
}
这是一个基本的查询语句,我们开启了profile展示详情查询,然后查询方式是match_all查询所有的文档。

分页

POST /kibana_sample_data_ecommerce/_search
{"from": 10,"size": 20,"query": {"match_all": {}}
}
我们查询指定索引的分页记录,from在es中是从0开始的,默认是返回10个结果。
这里我们是从10开始,查询20条记录。
当然了ES也存在深分页问题。

排序

POST /kibana_sample_data_ecommerce/_search
{"sort": [{"order_date": {"order": "desc"}}],"from": 10,"size": 20,"query": {"match_all": {}}
}
分页,并且对结果进行按照order_date的desc排序。
对于排序来说,最好是在数字型和日期型的字段上进行排序,因为对于多值类型或者分析过的字段排序,es会选一个值,无法得知该值。这里存疑,后面验证一下。

_source filtering
上面我们的查询都是查询回来的所有的文档字段,有时候你的查询结果是不需要有些字段的,所以可以指定你要查询的结果里面有哪些属性。

POST /kibana_sample_data_ecommerce/_search
{"_source": ["order_date"],"from": 10,"size": 20,"query": {"match_all": {}}
}
我们这里就查了一个字段order_date,要是你的_source里面没有存储这个字段,那你查出来的就是文档的元数据,其他的没信息。
_source也支持通配符的查询_source["name*","desc*"]"hits" : [{"_index" : "kibana_sample_data_ecommerce","_type" : "_doc","_id" : "RKOM1oEBYdLA1Zb4Ka7u","_score" : 1.0,"_source" : {"order_date" : "2022-07-12T09:43:12+00:00" 只返回一个}},]

脚本字段
DSL中可以按照painless脚本来结合其他字段计算出一个新的结果作为查询返回。
例子:订单中有不同的汇率,需要结合汇率对订单进行排序。

POST /kibana_sample_data_ecommerce/_search
{"script_fields": {"new_field_lyx": {  给我们的结果命名为new_field"script": {"lang": "painless","source": "doc['order_date'].value + 'hello'"}}},"from": 10,"size": 20,"query": {"match_all": {}}
}
我们指定了painless脚本,把order_date订单下单日期和hello结合起来了。
查询结果如下:
"hits" : [{"_index" : "kibana_sample_data_ecommerce","_type" : "_doc","_id" : "_KOM1oEBYdLA1Zb4OLn0","_score" : 1.0,"fields" : {  脚本查询的结果再这里显示"new_field_lyx" : ["2022-07-02T10:48:00.000Zhello"]}}]

使用查询表达式-Match

POST /movies/_search
{"query": {"match": {"title": "Road to Utopia"}}
}
普通的match查询,指定字段,这种他是分词之后查的其实是Road OR to OR Utopia
三个词随便出来一个匹配的就行。
要想做成三个同时匹配的需要加操作如下:
POST /movies/_search
{"query": {"match": {"title":{"query": "Road to Utopia","operator": "and"   这一行标识查询的时候三个都匹配才行,而且不区分顺序}}}
}

短语搜索-Match Phrase
上面那种是分词之后按照词匹配的,这种是直接搜语句。

POST /movies/_search
{"query": {"match_phrase": {"title":{"query": "Road to Utopia"}}}
}
这种匹配出来的只能是包含Road to Utopia这个语句的,而且严格词汇顺序,中间不能有插入别的字段的。POST /movies/_search
{"query": {"match_phrase": {"title":{"query": "Road Utopia","slop": 1}}}
}
"slop": 1表示你不需要完全按照这个语句匹配,中间插入一个字符也能被匹配到
举个例子,你不加这个你查“我你”,这时候我爱你是查不出来的。但是你加了"slop": 1这时候就允许中间出一个字,我爱你就能查到了,但是我很爱你不行,因为他加了两个字。

二、总结

查询语法很基本,但是掌握扎实,后面才能灵活应用。其实复杂的DSL最好还是别写,设计好点规避复杂查询。

橘子学ES12之DSL搜索相关推荐

  1. 橘子学ES11之URI搜索方式

    ES的查询方式有两种,一个是URI的查询,查询的内容和参数都在查询路径上带着,有点像GET方法的查询. 另一个是RequestBody的查询,也就是DSL.查询的参数都在请求体中带着.有点类似POST ...

  2. Elasticsearch的DSL搜索

    Elasticsearch的DSL搜索 一.数据准备 1.创建对应的索引库 2.给索引库创建对应的映射 POST 192.168.1.117:9200/sell/_mapping {"pro ...

  3. 橘子学ES10之搜索API入门

    ES主要功能就是存储数据,然后提供丰富的搜索功能.所以从这篇开始我们正式进入搜索想关的学习,这一篇先开个简单API的头. 一.API简介 ES的search查询API大致分为两种,一种是简单的就在UR ...

  4. 橘子学ES19之词项搜索全文检索

    在ES中,词项搜索也叫term搜索,term就有词项的意思.词项检索的意思就是说我输入一个词汇,在检索的时候不会把你输入的这个词汇做分词,匹配条件就是完整的输入的词汇,但是文档插入的时候该分词还是分词 ...

  5. ES DSL搜索 - prefix、fuzzy和wildcard

    1 介绍 主要介绍索引请求的基础API操作,使用postman进行请求,接口请求的前缀地址统一为elasticsearch 部署IP地址+端口号(例如 http://192.168.51.4:9200 ...

  6. 橘子学Mysql之成本计算(上)

    你是不是经常看到索引失效或者不走索引的话语.你是不是觉得mysql这个东西怎么动不动就不走我的索引了. 甚至我看到一句话:mysql的优化器一思考,上帝都发愁. 种种迹象都说明,mysql的索引是真T ...

  7. 橘子学ES16之分词三大组件以及如何自己实现自己的分词器

    本文来看一下ES的多字段特性,以及如何配置一个自定义的分词器. 一.多字段类型 多字段特性:可以实现精确匹配.可以使用不同的analyzer,就是搜索的时候是一个分词器,插入的时候是另一个分词器. 1 ...

  8. Elaticsearch第十二篇 Es的文档的DSL搜索(三 must、mustnot、should 组合成bool)

    一.多列搜索查询 {"query": {"multi_match": {"query": "马可菠萝","fi ...

  9. 橘子学ES03之Docker安装ELK+cerebro

    首先明白一点,ES是一个十分支持容器化运行的东西,加之docker的操作便捷性.前两篇我操作es和kibana真是够够的了. 一.服务器安装docker #1.卸载旧的版本: yum remove d ...

最新文章

  1. 配置oracle服务器以从外部机器访问oracle
  2. Java中的即时编译(Just-in-time compilation)
  3. C#--数据类型和类型转换
  4. 设计模式-策略模式和工厂模式结合使用
  5. 【渝粤题库】国家开放大学2021春2227物业设备设施管理题目
  6. setdefault_Java语言环境setDefault()方法及示例
  7. python逻辑流程图_python-程序流程图
  8. 学习echarts需要先学习java 吗_Echarts和Echarts-java类库简单使用方法
  9. gcc/g++ 的参数总结(二)
  10. vue 中使用rem布局
  11. python-包机制
  12. Android 一键加速原理
  13. 深入浅出SIP协议详解(以呼叫中心呼入呼出为例)
  14. 戴尔服务器预装系统如何降级,在戴尔计算机上降级系统BIOS | Dell 中国
  15. Jmeter创建大批量测试用户数据技巧
  16. 神器大师泰兹瑞与威穆
  17. 如何批量重命名文件?
  18. 论文阅读_(GIN)How Powerful are Graph Neural Networks
  19. 联想安装Ubuntu16.04LTS(双系统)知识点汇总(六个小时才下好
  20. 520,焊武帝为女朋友制作的硬核礼物

热门文章

  1. php手机网页下载文件,php 手机下载 POST 类
  2. 开放式运动耳机好不好用,五款最好用的骨传导耳机推荐
  3. 嵌入式监控【v4l2采集->vpu编码->live555推流】
  4. 他人的数据挖掘面试题-经验
  5. 2021年秋招面经:上海禾赛提前批(FPGA设计)
  6. html中em使用例子,HTML DOM Emphasized用法及代码示例
  7. 第二章 源力、质量、能量
  8. Rational Quanlity使用体验
  9. 【记录一次服务器被攻击】-[附带解决方案]
  10. 养蚕日记软件测试,养蚕的过程日记300字