本文翻译自:www.elastic.co/guide/en/el…html
本文是Elasticsearch的入门文档,将会介绍ElasticSearch中的查询操做和过滤操做。bash
如今咱们已经看到了一些基本的搜索参数,让咱们再深刻查询DSL。咱们先来看看返回的文档字段。默认状况下,完整的JSON文档做为全部搜索的一部分返回。这被称为源(搜索匹配中的_source字段)。若是咱们不但愿整个源文档返回,咱们有能力只须要返回源内的几个字段。elasticsearch
此示例显示如何从搜索中返回两个字段account_number和balance(在_source以内):ide
GET /bank/_search
{
"query": { "match_all": {} },
"_source": ["account_number", "balance"]
}复制代码
请注意,上面的例子简单地减小了_source字段。它仍然会返回一个名为_source的字段,但在其中只包含字段account_number和balance。学习
若是你会一些SQL语句,则容易看出上述内容在概念上与SQL SELECT FROM字段列表有些类似。优化
如今咱们来看看查询部分。之前,咱们已经看过如何使用match_all查询来匹配全部文档。如今咱们来介绍一个叫作匹配查询(match query)的新查询,这个查询能够被看做是基本的搜索查询(即针对特定字段或者字段集合进行的搜索)。ui
GET /bank/_search
{
"query": { "match": { "account_number": 20 } }
}复制代码
此示例返回地址中包含术语“mill”的全部账户:spa
GET /bank/_search
{
"query": { "match": { "address": "mill" } }
}复制代码
此示例返回地址中包含术语“mill”或“lane”的全部账户:翻译
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } }
}复制代码
这个例子是match(match_phrase)的一个变体,返回在地址中包含短语“mill lane”的全部帐号:code
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}复制代码
如今咱们来介绍一下bool query。 bool查询容许咱们使用布尔逻辑将更小的查询组合成更大的查询。
此示例组成两个match查询,并返回地址中包含“mill”和“lane”的全部账户:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}复制代码
在上面的例子中,bool must子句指定了一个文档被认为是匹配的全部查询。
相反,这个例子组成两个match查询,并返回地址中包含“mill”或“lane”的全部账户:
GET /bank/_search
{
"query": {
"bool": {
"should": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}复制代码
在上面的例子中,bool should子句指定了一个查询列表,其中任何一个查询都必须是true,才能被视为匹配的文档。
本示例组成两个match查询,并返回地址中既不包含“mill”也不包含“lane”的全部账户:
GET /bank/_search
{
"query": {
"bool": {
"must_not": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}复制代码
在上面的例子中,bool must_not子句指定了一个查询列表,其中任何一个查询都不能被匹配。
咱们能够在一个bool查询中同时结合must,should和must_not子句。此外,咱们能够在任何这些bool子句中编写bool查询来模拟任何复杂的多级布尔逻辑。
这个例子返回全部40岁但ID不为(aho)的人的帐号:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}复制代码
在上一节中,咱们跳过了一个称为文档分数(搜索结果中的_score字段)的细节。分数是一个数字值,它是文档与咱们指定的搜索查询匹配度的相对度量。分数越高,文档越相关,分数越低,文档就越不相关。
但查询并不老是须要产生分数,特别是当它们仅用于“过滤”文档集时。 Elasticsearch检测这些状况并自动优化查询执行,以便不计算无用分数。
咱们在前一节介绍的bool查询也支持过滤子句,它容许使用查询来限制将被其余子句匹配的文档,而不改变计算得分的方式。做为一个例子,咱们来介绍一下范围查询(range query),它容许咱们经过一系列值来过滤文档。这一般用于数字或日期过滤。
本示例使用bool查询返回余额在20000和30000之间的全部账户。换句话说,咱们要查找大于或等于20000且小于等于30000的账户。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}复制代码
解析上述内容,bool查询包含一个match_all查询(查询部分)和一个range查询(过滤器部分)。咱们能够将其余查询替换为查询和过滤器部分。在上述状况下,范围查询是很是有意义的,由于落入该范围的文档所有匹配“相等”,即没有文档比另外一个文档更加匹配。
除了match_all,match,bool和range查询以外,还有不少其余查询类型可用,咱们不在这里介绍。因为咱们已经对其工做原理有了一个基本的了解,因此将这些知识应用于其余查询类型的学习和实验并不难。