ElasticSearch 高级查询

一. Query Context

在查询过程当中,除了判断文档是否知足查询条件,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件匹配的有多好正则表达式

1.1 模糊匹配

{
	"query":{
		"match":{
			"tittle":"ElasticSearch学习"
		}
	}
}

像上面这样查询,会将包含”ElasticSearch“和”学习“结果查出来json

1.2 习语匹配(全词匹配)

将上面的”match“改成”match_phrase“,即缓存

{
	"query":{
		"match_phrase":{
			"tittle":"ElasticSearch学习"
		}
	}
}

这样就会把”ElasticSearch学习“作全词匹配,只有彻底包含”ElasticSearch学习“的结果才会返回学习

1.3 多个字段模糊匹配查询

{
	"query":{
		"multi_match":{
			"query":"李六",
			"fields":["author","tittle"]
		}
	}
}

使用”multi_match“,将要查询的关键字写在”query“子字段中,并列出所要查询的域,如上是要查询”author“和”tittle“字段中包含”李六“的结果spa

1.4 “query_string” 语法查询

语法查询是根据必定的语法规则进行的查询,常常在kibana中用,作数据搜索用的,也支持通配符,范围查询,布尔查询,正则表达式等,语法表达比较丰富。code

{
	"query":{
		"query_string":{
			"query":"(李六 AND 哈哈) OR 西瓜书",
			"fields":["author","tittle"]
		}
	}
}

上述查询示例所要实现的是在域“author” 和“tittle”中,查找同时包含“李六”和“哈哈”,或者包含“西瓜书”的结果。文档

1.5 字段查询(结构化数据查询)

{
	"query":{
		"term":{
			"author":"李六"
		}
	}
}

指定查询“author”为“李六”的结果string

1.6 范围查询

{
	"query":{
		"range":{
			"word_count":{
				"gte":20000,
				"lte":30000
			}
		}
	}
}

"gte"表示“大于等于”,“lte”表示“小于等于”,这里是查询“word_count”字段大于等于20000,小于等于30000的结果。it

二. Filter Context

在查询过程当中,只判断该文档是否知足条件,只有Yes或者No.ast

{
	"query":{
		"bool":{
			"filter":{
				"term":{
					"word_count":20000
				}
			}
		}
	}
}

"filter"要结合“bool”来使用,上述语句查询“word_count”字段为20000的数据。“filter”就是用来作数据过滤的,并且ES会对它的结果进行缓存,因此相对“query”要快一些。

三. 复合条件查询

3.1 固定分数查询

查询出”tittle“中含有”es“的结果以后能够发现每条结果的score是不一样的,下面的语句把查出来的结果的score值固定为了2

{
	"query":{
		"constant_score":{
			"filter":{
				"match":{
					"tittle":"es"
				}
			},
			"boost":2
		}
	}
}

3.2 布尔查询

下面的”should“至关于”或“,只要”author“中包含”李六“或者”tittle“中包含”es“的结果就会被返回

{
	"query":{
		"bool":{
			"should":[
				{
					"match":{
						"author":"李六"
					}
				},
				{
					"match":{
						"tittle":"es"
					}
				}
			]
		}
	}
}

还有”must“和”must_not“,分别对用的”与“,和”非“,使用的时候只须要把”should“替换便可。除此以外,还能够结合filter对查询结果作过滤:

{
	"query":{
		"bool":{
			"must":[
				{
					"match":{
						"author":"李六"
					}
				},
				{
					"match":{
						"tittle":"es"
					}
				}
			],
			"filter":[
				{
					"term":{
						"publish_date":"1995-03-16"
					}
				}
			]
		}
	}
}

以上查询结果要求”author“必须包含”李六“,”tittle“必须包含”es“,而且对结果进行过滤,只返回”publish_date“为”1995-03-16“的结果

相关文章
相关标签/搜索