[翻譯]ElasticSearch官方文件-查詢語言

飛來來發表於2017-11-05

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

本文是Elasticsearch的入門文件,將會介紹ElasticSearch中的查詢語言。

查詢語言

Elasticsearch提供了一種可用於執行查詢的特定於域的JSON風格的的語言。這被稱為查詢DSL。查詢語言相當全面,第一次接觸可能會讓人恐慌,但實際學習的最佳方式是從幾個基本的例子開始。

回到我們的最後一個例子,我們執行了這個查詢:

GET /bank/_search
{
  "query": { "match_all": {} }
}複製程式碼

解析上面的內容,查詢部分告訴我們什麼是查詢定義,而match_all部分就是我們要執行的查詢型別。 match_all查詢只是搜尋指定索引中的所有文件。

除了query引數外,我們還可以傳遞其他引數來影響搜尋結果。在上面的例子中,我們通過sort,這裡我們傳遞size

GET /bank/_search
{
  "query": { "match_all": {} },
  "size": 1
}複製程式碼

請注意,如果未指定size,則預設為10。

此示例執行match_all並返回文件11至20:

GET /bank/_search
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 10
}複製程式碼

from引數(基於0)指定要從哪個文件索引開始,size引數指定從from引數開始返回多少文件。實現分頁搜尋結果時,此功能非常有用。請注意,如果未指定from,則預設為0。

此示例執行match_all,並按結果按降序按帳戶餘額排序,並返回前10名(預設大小)文件。

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": { "balance": { "order": "desc" } }
}複製程式碼

執行搜尋

現在我們已經看到了一些基本的搜尋引數,我們再來看一下查詢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的新查詢,可以將其視為基本的欄位搜尋查詢(即針對特定欄位或一組欄位進行搜尋)。此示例返回的帳號為20:

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" } }
}複製程式碼

此示例是match(match_phrase)的變體,它返回所有包含地址中的“mill lane”短語的帳戶:

GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}複製程式碼

現在介紹一下bool query。 bool query
允許我們使用布林邏輯將較小的查詢組合成較大的查詢。

此示例組成兩個match查詢,並返回包含“mill”和“lane”的所有帳戶在地址中:

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}複製程式碼

在上面的例子中,bool must子句指定文件被認為是匹配的所有查詢必須為true。

相比之下,此示例組成兩個match查詢,並返回地址中包含“mill”或“lane”的所有帳戶:

GET /bank/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}複製程式碼

在上面的例子中,bool should子句指定一個查詢列表,匹配文件中的任意一個為true。

此示例組成兩個匹配查詢,並返回在地址中既不包含“mill”也不包含“lane”的所有帳戶:

GET /bank/_search
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}複製程式碼

在上面的示例中,bool must_not子句指定了一個查詢列表,對於一個被認為是匹配的文件,它們都不是true。

我們可以在一個bool查詢中同時結合使用must,should和must_not子句。此外,我們可以在任何這些bool子句中組合bool查詢,以模擬任何複雜的多級布林邏輯。

此示例返回所有40歲,但state不是ID的人的所有帳戶:

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}複製程式碼

相關文章