Elasticsearch简单入门--elasticsearch Executing Searches

翻译地址: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查询之外,还有许多其他可用的查询类型,我们不会在这里讨论它们。由于我们已经对它们的工作原理有了基本的了解,因此将这些知识应用到其他查询类型的学习和试验中应该不会太难。

猜你喜欢

转载自blog.csdn.net/zhen_6137/article/details/86468379