翻译地址:https://www.elastic.co/guide/en/elasticsearch/reference/5.6/_executing_searches.html
Executing Searches
现在我们已经看到一些基本的搜索参数,让我们进一步研究查询DSL,首先让我们看看返回的文档字段,默认情况下,完整的JSON文档作为所有搜索的一部分返回,这称为source(搜索命中的_source字段),如果不希望返回整个源文档,我们有能力请求在Source中的一些字段作为返回。
下面这个例子展示如何返回2个字段,account_number 和 balance (在_source之内)从搜索中。
GET /bank/_search
{
"query": {
"match_all": {}
},
"_source": ["account_number", "balance"]
}
注意,这个上面的例子只是减少了_source中的字段,它仍然只返回一个名为_source的字段,但是其中只包含account_number和balance字段。
如果您来自SQL背景,那么上面的内容在概念上与SQL SELECT from字段列表有些类似。
现在让我们转到查询部分,在前面,我们已经看到了如何使用match_all查询来匹配所有文档,现在让我们引入一个名为match的新查询,它可以看作是一个基本的字段搜索查询(即针对特定字段或字段集进行的搜索)。
1. 这个示例返回编号为20的帐户:
GET /bank/_search
{
"query": {
"match": {
"account_number": 20
}
}
}
2. 此示例返回地址中包含术语“mill”的所有帐户:
GET /bank/_search
{
"query": {
"match": {
"address": "mill"
}
}
}
3. 此示例返回地址中包含术语“mill”或“lane”的所有帐户:
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } }
}
4. 这个例子是match (match_phrase)的一个变体,它返回地址中包含短语“mill lane”的所有帐户:
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
现在让我们引入bool query, 这个bool query允许我们通过boolean逻辑较小的查询组合成较大的查询。
5. 这个示例由2个match查询,并返回在address包含mill 和 lane的所有账号
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}
上面的例子中,这个bool must 字句指定对于一个被认为匹配的文档所有的查询必须为true,
6. 于此相反,这个例子由2个match查询组成,并且返回在address字段中包含mill 或者 lane的所有的账户:
GET /bank/_search
{
"query": {
"bool": {
"should": [
"match": {"address": "mill"},
"match": {"address": "lane"}
]
}
}
}
在上面的示例中,bool should子句指定了一个查询列表,对于要被认为匹配的文档,其中任何一个查询都必须为true
In the above example, the bool should
clause specifies a list of queries either of which must be true for a document to be considered a match
7. 这个示例由2个match查询组成,并且返回在address字段中既不包含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" } }
]
}
}
}
Executing Filters
在上一个章节,我们略过了一个名为document score的小细节(搜索结果中的_score字段),score是一个数字值,它是文档与我们指定的搜索查询匹配程度的一个相对度量. 这个score越高,该文档的相关度就越高,反之,则越低。
但是查询并不总是需要生成score,特别是当它们仅用于“过滤”文档集时。Elasticsearch检测这些情况,并自动优化查询执行,以避免计算无用的分数。
我们在上一节中介绍的bool查询还支持筛选子句,允许使用查询来限制将由其他子句匹配的文档,不改变分数的计算方式
例如,让我们引入范围查询,它允许我们通过一系列值过滤文档,这通常用于数字或日期筛选。
这个示例使用bool查询返回所有余额在20000到30000之间的帐户(包括20000,30000)。换句话说,我们希望找到余额大于或等于20000和小于或等于30000的账户。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
仔细分析上面的内容,bool查询包含一个match_all查询(查询部分)和一个范围查询(筛选部分)。我们可以将任何其他查询替换到查询和筛选器部件中。在上面的例子中,范围查询非常有意义,因为属于范围的文档都是“相等”匹配的,即,没有一份文件比另一份文件更相关,
除了match_all、match、bool和range查询之外,还有许多其他可用的查询类型,我们不会在这里讨论它们。由于我们已经对它们的工作原理有了基本的了解,因此将这些知识应用到其他查询类型的学习和试验中应该不会太难。