# /
# Query DSL
Elasticsearch提供了一个基于JSON的完整查询DSL(领域特定语言)来定义查询。
将Query DSL视为查询的AST(抽象语法树),由两种类型的子句组成:
Leaf query clauses叶查询子句在特定字段中查找特定值,例如匹配match、术语term或范围range查询。这些查询可以自己使用。
Compound query clauses复合查询子句包装其他叶查询或复合查询,用于以逻辑方式组合多个查询(如bool或dis_max查询),或更改它们的行为(如constant_score查询)。
Query DSL
Query and filter context 查询和筛选上下文
Compound queries 复合查询
Full text queries 全文查询
Geo queries 地理查询
Shape queries 形状查询
Joining queries 联接查询
Match all 全部匹配
Span queries 跨度查询
Specialized queries 专用查询
Term-level queries 术语级查询
minimum_should_match parameter 最小匹配参数
rewrite parameter 重写参数
Regular expression syntax 正则表达式语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查询与过滤器上下文
query参数
表示查询上下文(见官方文档)filter参数
表示过滤器上下文(见官方文档)
Query and filter context
query参数指示查询上下文。bool和两个match子句用于查询上下文中,这意味着它们用于对每个文档的匹配程度进行评分。
filter参数指示过滤器上下文。它的term和range子句用于过滤器上下文中。它们将过滤掉不匹配的文档,但不会影响匹配文档的得分。
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 相关性得分、元数据
hits[0]._score
为相关性得分hits[0]._source
为元数据
#select order_id,email from kibana_sample_data_ecommerce;
GET kibana_sample_data_ecommerce/_search
{
"_source": ["order_id","email"],
"query": {
"match_all": {}
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
{
"took" : 1,//查询时间
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4675,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "kibana_sample_data_ecommerce",
"_type" : "_doc",
"_id" : "DIPLx4sBZlLmIBOuZBAq",
"_score" : 1.0,
"_source" : {
"order_id" : 584677,
"email" : "eddie@underwood-family.zzz"
}
}
]
}
}
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
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
# Full text queries(全文检索)
Full text queries
全文查询使您能够搜索分析的文本字段,例如电子邮件正文。查询字符串使用索引期间应用于字段的相同分析器进行处理。
intervals query
match query
match_bool_prefix query
match_phrase query
match_phrase_prefix query
multi_match query
common terms query
query_string query
simple_query_string query
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# simple_query_string query
GET kibana_sample_data_ecommerce/_search?q=products.product_name:Sweatshirt
GET kibana_sample_data_ecommerce/_search
{
"query": {
"simple_query_string" : {
"query": "Sweatshirt",
"fields": ["products.product_name"]
}
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# query_string query
quick brown +fox -news
声明:
fox一定在场
news不得出现
quick和brown可选 — 他们的存在增加了相关性
1
2
3
4
5
2
3
4
5
((quick AND fox) OR (brown AND fox) OR fox) AND NOT news
使用匹配查询重写的同一查询将如下所示:
{
"bool": {
"must": { "match": "fox" },
"should": { "match": "quick brown" },
"must_not": { "match": "news" }
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
GET kibana_sample_data_ecommerce/_search
{
"query": {
"query_string": {
"query": "Sweatshirt AND black",//simple_query_string这种写法无效
"fields": ["products.product_name"]
}
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# match query
GET kibana_sample_data_ecommerce/_search
{
"query": {
"match": {
"products.product_name": "Sweatshirt black"
}
}
}
GET kibana_sample_data_ecommerce/_search
{
"query": {
"match": {
"products.product_name": {
"query": "Sweatshirt black",
"operator": "and"//默认是模糊查询
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# multi_match query
GET kibana_sample_data_ecommerce/_search
{
"query": {
"multi_match" : {
"query": "Sweatshirt black",
"operator": "and",
"fields": [ "products.product_name", "email" ]
}
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# match_phrase query
GET kibana_sample_data_ecommerce/_search
{
"query": {
"match_phrase": {
"products.product_name": {
"query": "Sweatshirt black"//有序
}
}
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# Term-level queries(术语级查询)
可以使用术语级查询根据结构化数据中的精确值查找文档。结构化数据的示例包括日期范围、IP地址、价格或产品ID。
与全文查询不同,术语级查询不分析搜索术语。相反,术语级查询与字段中存储的确切术语相匹配。
术语级查询仍然使用normalizer属性对关键字字段的搜索术语进行规范化。有关更多详细信息,请参见normalizer。
术语级查询的类型
exists query 存在查询
fuzzy query 模糊查询
ids query ids查询
prefix query 前缀查询
range query 范围查询 //返回包含所提供范围内的terms的文档。
regexp query 正则查询
term query 术语查询 //返回在提供的字段中包含确切term的文档。
terms query 术语查询 //返回在提供的字段中包含一个或多个确切terms的文档。
terms_set query 术语查询
type query 类型查询
wildcard query 通配符查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Term query
GET kibana_sample_data_ecommerce/_search
{
"query": {
"term": {//只对keyword有效
"products.product_id": 24772
}
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
GET kibana_sample_data_ecommerce/_search
{
"query": {
"term": {
"products.product_name.keyword": "Sweatshirt - black"
}
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# Terms query
GET kibana_sample_data_ecommerce/_search
{
"query": {
"terms": {
"products.product_id": [ 24772, 13992 ]//精准匹配到一个即可
}
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# Range query
GET kibana_sample_data_ecommerce/_search
{
"query": {
"range": {
"products.product_id": {
"gte": 13992,
"lte": 24772
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# Compound queries(复合查询)
复合查询包装其他复合查询或叶查询,以组合其结果和分数,更改其行为,或从查询切换到过滤上下文。
该组中的查询包括:
bool query 布尔查询
boosting query
constant_score query 恒定分数查询
dis_max query
function_score query
1
2
3
4
5
6
7
2
3
4
5
6
7
# bool query
它是使用一个或多个布尔子句构建的,每个子句都有一个类型化的引用。
must表示and。
should表示or,添加"minimum_should_match"则表示and。"minimum_should_match":1表示必须满足should字句的1个条件。
POST _search
{
"query": {
"bool" : {
"must" : {
"term" : { "user.id" : "kimchy" }
},
"filter": {
"term" : { "tags" : "production" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
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
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
# Constant score query
constant_score的顶级参数
filter查询不计算相关性分数。
boost用作恒定相关性分数。默认值为1.0
GET /_search
{
"query": {
"constant_score": {
"filter": {
"term": { "user.id": "kimchy" }
},
"boost": 1.2
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
← es1.3一些API es1.5聚合查询 →