[翻譯]ElasticSearch官方文件-執行查詢和過濾操作

飛來來發表於2017-11-16

本文翻譯自:www.elastic.co/guide/en/el…

本文是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查詢之外,還有很多其他查詢型別可用,我們不在這裡介紹。由於我們已經對其工作原理有了一個基本的瞭解,所以將這些知識應用於其他查詢型別的學習和實驗並不難。

相關文章