0%

ElasticSearch-SearchAPI

相关阅读:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/search-search.html

URI Search 顾名思义就是在 URL 中使用查询参数,例如:

1
2
3
4
GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
{
"profile": true
}
  • 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 字段
  • 分组
    • + 表示 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*
  • 正则表达式
    • title:\[bt]oy\
  • 模糊匹配与近似查询
    • title:befutifl~1,虽然查询拼写错误,但是依然能够匹配到 beautiful
    • title:”lord rings”~2,能够匹配查询出”lord of the rings”

相关阅读: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
2
3
4
5
6
7
POST /movies,404_idx/_search?ignore_unavailable=true
{
"profile": true,
"query": {
"match_all": {}
}
}
  • 分页查询
1
2
3
4
5
6
7
8
POST /kibana_sample_data_ecommerce/_search
{
"from":10,
"size":20,
"query":{
"match_all": {}
}
}

from 从 0 开始,默认返回 10 个结果,获取靠后的翻页成本较高。

  • 排序
1
2
3
4
5
6
7
POST kibana_sample_data_ecommerce/_search
{
"sort":[{"order_date":"desc"}],
"query":{
"match_all": {}
}
}

最后在“数字型”与“日期型”字段上进行排序,因为对于多值类型或者分析过的字段排序,系统会选择一个值,无法得知该值。

  • 过滤

可以使用 _source 指明要查询显示的字段,其支持使用通配符,示例如下:

1
2
3
4
5
6
7
POST kibana_sample_data_ecommerce/_search
{
"_source":["order_date", "desc*"],
"query":{
"match_all": {}
}
}
  • 脚本字段

DSL 支持对文档字段进行加工拼接计算等操作并以脚本字段进行返回,例如下面即是对 oder_date 拼接上字符串 hello 并作为脚本字段 new_field 进行返回:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
GET kibana_sample_data_ecommerce/_search
{
"script_fields": {
"new_field": {
"script": {
"lang": "painless", // 使用painless脚本语言来编写
"source": "doc['order_date'].value+'hello'"
}
}
},
"query": {
"match_all": {}
}
}

// 响应
{
//...
{
"_index" : "kibana_sample_data_ecommerce",
"_type" : "_doc",
"_id" : "pd8McYUBcQpcTnpn4oT4",
"_score" : 1.0,
"fields" : {
"new_field" : [
"2023-01-02T04:52:19.000Zhello"
]
}
}
//...
}
  • 查询表达式-Match
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 查询 title 字段包含单词 last 或者 christmas 的文档:
POST movies/_search
{
"query": {
"match": {
"title": "last christmas"
}
}
}

// 查询 title 字段包含单词 last 和 christmas 的文档:
POST movies/_search
{
"query": {
"match": {
"title": {
"query": "last christmas",
"operator": "and"
}
}
}
}
  • 短语搜索-Match Phrase
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 查询 title 包含 one love 短语的文档
POST movies/_search
{
"query": {
"match_phrase": {
"title":{
"query": "one love"
}
}
}
}

// 同 URI search 的 title:"one love"~1
POST movies/_search
{
"query": {
"match_phrase": {
"title":{
"query": "one love",
"slop": 1
}
}
}
}

3. Query String

相关阅读:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-query-string-query.html

类似 URI Query,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 查询name字段包含Ruan 和 Yiming 的文档
POST users/_search
{
"query": {
"query_string": {
"default_field": "name",
"query": "Ruan AND Yiming"
}
}
}

// 查询 name 或 about 字段包含 Ruan 和 Yiming 或者 Java 和 Elasticsearch 的文档
POST users/_search
{
"query": {
"query_string": {
"fields":["name","about"],
"query": "(Ruan AND Yiming) OR (Java AND Elasticsearch)"
}
}
}

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 查询 name 字段包含 Ruan 或 AND 或 Yiming 的文档
POST users/_search
{
"query": {
"simple_query_string": {
"query": "Ruan AND Yiming",
"fields": ["name"]
}
}
}

// 查询 name 字段包含 Ruan 且 Yiming 的文档
POST users/_search
{
"profile": true,
"query": {
"simple_query_string": {
"query": "Ruan Yiming",
"fields": ["name"],
"default_operator": "AND"
}
}
}

// 查询 title 字段包含 Beautiful 但不包含 mind 的文档
POST /movies/_search
{
"profile":true,
"query":{
"simple_query_string":{
"query":"Beautiful -mind",
"fields":["title"]
}
}
}
------ 本文结束------