执行搜索
现在我们已经知道了几个基本的参数, 让我们进一步学习查询语言。首先我们看一下返回文档的字段。 默认情况下,是返回完整的JSON文档的。这可以通过source
来引用(搜索hits
中的_source
字段)。如果我们不想返回完整的源文档,我们可以指定返回的几个字段。
下面这个例子说明了从搜索中只返回两个字段account_number
和balance
(这两个字段都必须包含在_source
中),如下:
GET /bank/_search
{
"query": { "match_all": {} },
"_source": ["account_number", "balance"]
}
注意到上面的例子简化了_source
字段,它仍将会返回一个叫做_source
的字段,但是只会包含account_number
和balance
两个子字段。
如果你有SQL经验,上述查询在概念上有些像SQL的 SELECT 字段1, 字段2 FROM TABLE_1
。
现在让我们进入到查询部分。之前,我们学习了match_all
查询是怎样匹配到所有的文档的。现在我们介绍一种新的查询,叫做match
查询,这可以看成是一个简单的字段搜索(比如对某个或某些特定字段的搜索)
下面这个例子返回账户编号为20的文档:
GET /bank/_search
{
"query": { "match": { "account_number": 20 } }
}
下面这个例子返回地址中包含了“mill”词条(term)的所有账户:
GET /bank/_search
{
"query": { "match": { "address": "mill" } }
}
下面这个例子返回地址中包含“mill”或者“lane”词条的账户:
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } }
}
下面这个例子是match
的变体(match_phrase
),它会去匹配短语“mill lane”:
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
现在,让我们介绍一下布尔查询。布尔查询允许我们利用布尔逻辑将较小的查询组合成较大的查询。
现在这个例子组合了两个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
语句指明,对于一个文档,查询列表中,只要有一个查询匹配,那么这个文档就被看成是匹配的。
现在这个例子组合了两个查询,它返回地址中既不包含“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" } }
]
}
}
}