查询
查询所有文档 - match_all
全文查询
词语匹配 - match
短语匹配 - match_phrase
短语前缀匹配 - match_phrase_prefix
多字段匹配 - multi_match
查询字符串查询 - query_string
简单字符串查询 - simple_query_string
精确级别查询
单个精确 - term
多查询条件 - terms
范围查询 - range
存在与否查询 - exists
术语前缀匹配 - prefix
通配符查询 - wildcard
正则表达式查询 - regexp
模糊查询 - fuzzy
类型搜索 - type
主键查询 - ids
复合查询
常量分数查询 - constant_score
布尔查询 - bool
最佳字段分值解析 - dis_max
分值函数计算查询 - function_score
boosting 降低某些内容的评分
多索引查询 - indices
连接查询
nested 嵌套查询
关联相同孩子 - has_child
关联相同双亲 - has_parent
父类id搜索 - parent_id
地理数据查询
地理形状查询 - geo_shape
geo_bounding_box 边界框搜索
距离搜索 - geo_distance
距离范围搜索 - geo_distance_range
多边形查询 - geo_polygon
特殊的搜索
相似搜索 - more_like_this
使用脚本查询 - script
查询
Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建 
更加复杂、强大的查询。 
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现

查询所有文档 - match_all
GET /_search
{
  "query": {
    "match_all": {}
  }
}
1
2
3
4
5
6
7
全文查询
全文查询是指对已经完成索引的文本字段进行查询,它会对查询词进行分析,然后去全文进行匹配。

词语匹配 - match
匹配查询接受文本/数字/日期,分析它们,并构造一个查询,它会将查询词分析后再去匹配。

GET /_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}
1
2
3
4
5
6
7
8
短语匹配 - match_phrase
短语匹配会分析文本,并从分析文本中创建短语查询,不会将查询短语拆开。

GET /_search
{
  "query": {
    "match_phrase": {
      "FIELD": "PHRASE"
    }
  }
}
1
2
3
4
5
6
7
8
短语前缀匹配 - match_phrase_prefix
它与短语匹配的区别为它能匹配的方位更广,它可以命中到短语+其他内容的内容

GET /_search
{
  "query": {
    "match_phrase_prefix": {
      "FIELD": "PREFIX"
    }
  }
}
1
2
3
4
5
6
7
8
多字段匹配 - multi_match
它允许在多个字段上进行匹配,字段名允许通配符,还支持多种评分计算规则。是

GET /_search
{
  "query": {
    "multi_match": {
      "query": "",
      "fields": [],
      "type": "best_fields"
    }
  }
}
1
2
3
4
5
6
7
8
9
10
查询字符串查询 - query_string
一种使用查询解析器来解析其内容的查询,可以在多值上,设置查询条件之间的关系

GET /_search
{
  "query": {
    "query_string": {
      "default_field": "FIELD",
      "query": "this AND that OR thus",
      "fields": [],
      "default_operator": "OR"
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
简单字符串查询 - simple_query_string
类似于短语匹配,于字符串查询相比,它不会抛出异常,并丢弃查询无效的部分。

GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "",
      "fields": [],
      "default_operator": "OR"
    }
  }
}
1
2
3
4
5
6
7
8
9
10
精确级别查询
它是对索引后的倒排索引进行查询的,这些查询通常用于诸如数字、日期和枚举等结构化数据,而不是完整的文本字段。

单个精确 - term
术语查询会找到包含反向索引中指定的确切术语的文档,即它不会对查询词进行分析。

GET /_search
{
  "query": {
    "term": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
多查询条件 - terms
它可以使用多个查询条件,并且可以跨索引查找

GET /_search
{
  "query": {
    "terms": {
      "FIELD": [
        "VALUE1",
        "VALUE2"
      ]
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
范围查询 - range
范围搜索可用于数组、日期

GET /_search
{
  "query": {
   "range": {
     "FIELD": {
       "gte": 10,
       "lte": 20
     }
   }
  }
}
1
2
3
4
5
6
7
8
9
10
11
存在与否查询 - exists
返回在原始字段中至少有一个非空值的文档:其实可以使用_field_names字段来查找

GET /_search
{
    "query": {
        "exists" : { "field" : "user" }
    }
}
1
2
3
4
5
6
术语前缀匹配 - prefix
与查询值前缀相同的术语都可以匹配

GET /_search
{
  "query": {
  "prefix": {
    "FIELD": {
      "value": ""
    }
  }
  }
}
1
2
3
4
5
6
7
8
9
10
通配符查询 - wildcard
查询的内容可以使用统配符

GET /_search
{
  "query": {
    "wildcard": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
正则表达式查询 - regexp
查询词可以使用正则

GET /_search
{
  "query": {
    "regexp": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
模糊查询 - fuzzy
即相似词查询,其中fuzziness设置相似程度,prefix_length可以设置从什么地方开始使用模糊匹配

GET /_search
{
  "query": {
   "fuzzy": {
     "field": {
       "value": "",
       "fuzziness": 0.5,
       "prefix_length": 0
     }
   }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
类型搜索 - type
返回该类型下的所有数据

GET /_search
{
    "query": {
        "type" : {
            "value" : "my_type"
        }
    }
}
1
2
3
4
5
6
7
8
主键查询 - ids
返回指定id的文档

GET /_search
{
    "query": {
        "ids" : {
            "type" : "my_type",
            "values" : ["1", "4", "100"]
        }
    }
}
1
2
3
4
5
6
7
8
9
复合查询
复合查询封装了其他符合或简单查询,可以组合它们的结果和分数,改变它们的行为。

常量分数查询 - constant_score
它使查询返回的文档都有固定的分值,可以与没有分值得过滤器配合使用

GET /_search
{
  "query": {
    "constant_score": {
      "filter": {

      },
      "boost": 1.2
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
布尔查询 - bool
将几个查询的返回用布尔结果拼接

GET /_search
{
  "query": {
    "bool": { 
      "should": [  #不一定要满足的条件 如果满足加入评分
        {
          "term": {}
        }
      ],
      "must": [  #下面放必须满足的查询条件
        {
          "match": {}
        },
        {
          "term": {}
        }
      ],
      "must_not": [ #存放要排除的内容
        {
          "term": {}
        }
      ]
    }
  }
}
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
最佳字段分值解析 - dis_max
相比较bool的分值是总数计算,dis_max是使用最佳字段匹配模式的

GET /_search
{
  "query": {
    "dis_max": {
      "tie_breaker": 0.7, 
      "boost": 1.2,
      "queries": [ #这里存放的搜索是使用or关联的
        {
          "term": {} 
        }
      ]
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
分值函数计算查询 - function_score
使用函数来重新计算查询文档的分值,需要有一个查询,和一个或多个函数

GET /_search
{
  "query": {
    "function_score": {
      "query": {},
      "functions": [
        {}
      ]
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
boosting 降低某些内容的评分
相当于bool中的must和must_not,但不同的是此排除的内容是会加入到命中的,只是评分被降低了

GET /_search
{
  "query": {
    "boosting": {
      "negative": { #需要排除或者说降低评分的内容

      },
      "positive": { #需要满足的查询

      },
      "negative_boost": 0.2 #降低的评分
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
多索引查询 - indices
指定索引的查询

GET /_search
{
  "query": {
    "indices": {
      "indices": [
        "INDEX1",
        "INDEX2"
      ],
      "query": {}
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
连接查询
需要把个类型连接到一起进行查询

nested 嵌套查询
对嵌套对象使用,可以查询嵌套对象下面的内容

GET /_search
{
  "query": {
    "nested": {
      "path": "nested", #嵌套对象,下面使用nested.field
      "query": {}
    }
  }
}
1
2
3
4
5
6
7
8
9
关联相同孩子 - has_child
将有相同子类的type连接到一起

GET /_search
{
  "query": {
    "has_child": {
      "type": "child", #子类型为child的所以父类型参与搜索
      "query": {}
    }
  }
}
1
2
3
4
5
6
7
8
9
关联相同双亲 - has_parent
有相同父类型的子类型参与搜索,父子关系通过元数据_parent属性指定

GET /_search
{
  "query": {
    "has_parent": {
      "parent_type": "TYPE", #具有相同父类型的子类型参与搜索
      "query": {}
    }
  }
}
1
2
3
4
5
6
7
8
9
父类id搜索 - parent_id
在父类型下根据id搜索文档,其实相当于使用has_patent 然后对id进行查找,不过has_parent和has_child需要进行联接,消耗比较大。此查询性能高于前两个

GET /my_index/_search
{
    "query": {
        "parent_id" : {
            "type" : "blog_tag", 
            "id" : "1"
        }
    }
}
1
2
3
4
5
6
7
8
9
地理数据查询
用于地理类型的查询,字段类型为geo_point或geo_shape

地理形状查询 - geo_shape
将地里坐标划分成一个个网格,然后通过网格之间的关系进行匹配,可以是INTERSECTS(交叉),DISJOINT(不想交) ,WITHIN(在查询内), CONTAINS (包含查询)

geo_bounding_box 边界框搜索
通过两个点确定一个长方形边界框,来搜索在边界框中的点

GET /_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_bounding_box" : {
                    "location" : {
                        "top_left" : { #左上角坐标
                            "lat" : 40.73, 
                            "lon" : -74.1
                        },
                        "bottom_right" : { #右下角坐标
                            "lat" : 40.01,
                            "lon" : -71.12
                        }
                    }
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
距离搜索 - geo_distance
返回两点距离在设定距离内的文档

GET /_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "200km", #设置距离
                    "location" : { 查询点
                        "lat" : 40,
                        "lon" : -70
                    }
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
距离范围搜索 - geo_distance_range
返回两点距离在范围内的数据

GET /_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance_range" : {
                    "from" : "200km", #最小距离
                    "to" : "400km", #最大距离
                    "location" : { #查询点
                        "lat" : 40,
                        "lon" : -70
                    }
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
多边形查询 - geo_polygon
使用点确定一个多边形,返回图形内的数据

GET /_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_polygon" : {
                    "location" : {
                        "points" : [  #根据点确定多边形
                        {"lat" : 40, "lon" : -70},
                        {"lat" : 30, "lon" : -80},
                        {"lat" : 20, "lon" : -90}
                        ]
                    }
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
特殊的搜索
相似搜索 - more_like_this
查看相似的文档内容,像推荐系统就可以通过使用此查询查找相似的内容。也可以 
传入文档进行比较。

GET /_search
{
  "query": {
    "more_like_this": {
      "fields": [
        "FIELD"
      ],
      "like_text": "text like this one",
      "min_term_freq": 1,
      "max_query_terms": 12
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
使用脚本查询 - script
在查询语句中使用脚本,一般用于过滤环境汇中。

GET /_search
{
    "query": {
        "bool" : {
            "must" : {
                "script" : {
                    "script" : {
                        "source": "doc['num1'].value > 1", #脚本语句
                        "lang": "painless"
                     }
                }
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
官方API文档: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html 
官方中文指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
--------------------- 
作者:Gchaochao 
来源:CSDN 
原文:https://blog.csdn.net/g1969119894/article/details/80111067 
版权声明:本文为博主原创文章,转载请附上博文链接!