美文网首页ES玩转大数据大数据
[翻译]ElasticSearch官方文档-执行查询和过滤操作

[翻译]ElasticSearch官方文档-执行查询和过滤操作

作者: 飞来来 | 来源:发表于2017-11-15 19:25 被阅读28次
    image

    本文翻译自:https://www.elastic.co/guide/en/elasticsearch/reference/current/_executing_searches.html#_executing_searches

    本文是Elasticsearch的入门文档,将会介绍ElasticSearch中的查询操作和过滤操作。

    执行查询

    现在我们已经看到了一些基本的搜索参数,让我们再深入查询DSL。我们先来看看返回的文档字段。默认情况下,完整的JSON文档作为所有搜索的一部分返回。这被称为源(搜索匹配中的_source字段)。如果我们不希望整个源文档返回,我们有能力只需要返回源内的几个字段。

    此示例显示如何从搜索中返回两个字段account_numberbalance(在_source之内):

    GET /bank/_search
    {
      "query": { "match_all": {} },
      "_source": ["account_number", "balance"]
    }
    

    请注意,上面的例子简单地减少了_source字段。它仍然会返回一个名为_source的字段,但在其中只包含字段account_numberbalance

    如果你会一些SQL语句,则容易看出上述内容在概念上与SQL SELECT FROM字段列表有些相似。

    现在我们来看看查询部分。以前,我们已经看过如何使用match_all查询来匹配所有文档。现在我们来介绍一个叫做匹配查询(match query)的新查询,这个查询可以被看作是基本的搜索查询(即针对特定字段或者字段集合进行的搜索)。

    GET /bank/_search
    {
      "query": { "match": { "account_number": 20 } }
    }
    

    此示例返回地址中包含术语“mill”的所有帐户:

    GET /bank/_search
    {
      "query": { "match": { "address": "mill" } }
    }
    

    此示例返回地址中包含术语“mill”或“lane”的所有帐户:

    GET /bank/_search
    {
      "query": { "match": { "address": "mill lane" } }
    }
    

    这个例子是matchmatch_phrase)的一个变体,返回在地址中包含短语“mill lane”的所有账号:

    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查询中同时结合mustshouldmust_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_allmatchboolrange查询之外,还有很多其他查询类型可用,我们不在这里介绍。由于我们已经对其工作原理有了一个基本的了解,所以将这些知识应用于其他查询类型的学习和实验并不难。

    相关文章

      网友评论

        本文标题:[翻译]ElasticSearch官方文档-执行查询和过滤操作

        本文链接:https://www.haomeiwen.com/subject/zvbtvxtx.html