1. URI Search
相关阅读:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/search-search.html
URI Search 顾名思义就是在 URL 中使用查询参数,例如:
1 | GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s |
- q 指定查询语句,使用 Query String Syntax。
- df 指明查询字段,不指定时默认查询所有字段。例如
q=2012&df=title
指查询包含 2012 的 title 字段。 - sort 排序 / from 和 size 分页
- profile 可以查看查询是如何执行的
1.1 Query String Syntax
- 指明字段 & 泛查询
- q=title:2012 / q=2012
- Term & Phrase
- Beautiful Mind 等效于 Beautiful OR Mind
- “Beautiful Mind” 等效于 Beautiful AND Mind。Phrase 查询要求前后顺序保持一致
- 分组 & 引号
- title:(Beautiful AND Mind)
- title:”Beautiful Mind”
- 布尔操作
- AND OR NOT 或者 && || !
- 必须大写
- title:(matrix NOT reloaded):表示查询包含 matrix 但没有 reloaded 的 title 字段
- AND OR NOT 或者 && || !
- 分组
- + 表示 must
- - 表示 must_not
- title:(+matrix -reloaded):表示查询包含 matrix 但没有 reloaded 的 title 字段
- 范围查询
- 区间表示:[] 闭区间,{} 开区间
- year:{2019 TO 2021}
- year:[* TO 2018]
- 区间表示:[] 闭区间,{} 开区间
- 算数符号
- year:>2010
- year:(>2010 && <= 2018)
- year:(+>2010 +<= 2018)
- 通配符查询(通配符查询效率低,占用内存大,不建议使用,特别是放在前面)
- ? 代表 1 个字符,* 代表 0 或多个字符
- title:mi?d
- title:be*
- ? 代表 1 个字符,* 代表 0 或多个字符
- 正则表达式
- title:\[bt]oy\
- 模糊匹配与近似查询
- title:befutifl~1,虽然查询拼写错误,但是依然能够匹配到 beautiful
- title:”lord rings”~2,能够匹配查询出”lord of the rings”
2. Request Body Search
相关阅读:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/search-request-body.html
在线SQL转DSL工具:http://atotoa.com/
Request Body Search 使用 ElasticSearch 提供的,基于 JSON 格式的更加完备的 Query Domain Specific Language (DSL) 进行查询。其将查询语句通过 HTTP Request Body 发送给 ElasticSearch,例如:
1 | POST /movies,404_idx/_search?ignore_unavailable=true |
- 分页查询
1 | POST /kibana_sample_data_ecommerce/_search |
from 从 0 开始,默认返回 10 个结果,获取靠后的翻页成本较高。
- 排序
1 | POST kibana_sample_data_ecommerce/_search |
最后在“数字型”与“日期型”字段上进行排序,因为对于多值类型或者分析过的字段排序,系统会选择一个值,无法得知该值。
- 过滤
可以使用 _source 指明要查询显示的字段,其支持使用通配符,示例如下:
1 | POST kibana_sample_data_ecommerce/_search |
- 脚本字段
DSL 支持对文档字段进行加工拼接计算等操作并以脚本字段进行返回,例如下面即是对 oder_date 拼接上字符串 hello 并作为脚本字段 new_field 进行返回:
1 | GET kibana_sample_data_ecommerce/_search |
- 查询表达式-Match
1 | // 查询 title 字段包含单词 last 或者 christmas 的文档: |
- 短语搜索-Match Phrase
1 | // 查询 title 包含 one love 短语的文档 |
3. Query String
相关阅读:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-query-string-query.html
类似 URI Query,示例如下:
1 | // 查询name字段包含Ruan 和 Yiming 的文档 |
4. Simple Query String
相关阅读:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-simple-query-string-query.html
类似 Query String,但是会忽略错误的语法,同时只支持部分查询语法。Simple Query String 不支持 AND OR NOT ,会被当做字符串处理,且 Term 之间默认的关系是 OR,可以指定 Operator 来设置 AND OR NOT 关系。
Simple Query String 还支持部分
逻辑:
- + 替代 AND
- | 替代 OR
- - 替代 NOT
1 | // 查询 name 字段包含 Ruan 或 AND 或 Yiming 的文档 |