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

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

本文是Elasticsearch的入門文檔,將會介紹ElasticSearch中的查詢操做和過濾操做。bash

執行查詢

如今咱們已經看到了一些基本的搜索參數,讓咱們再深刻查詢DSL。咱們先來看看返回的文檔字段。默認狀況下,完整的JSON文檔做爲全部搜索的一部分返回。這被稱爲源(搜索匹配中的_source字段)。若是咱們不但願整個源文檔返回,咱們有能力只須要返回源內的幾個字段。elasticsearch

此示例顯示如何從搜索中返回兩個字段account_numberbalance(在_source以內):ide

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

請注意,上面的例子簡單地減小了_source字段。它仍然會返回一個名爲_source的字段,但在其中只包含字段account_numberbalance學習

若是你會一些SQL語句,則容易看出上述內容在概念上與SQL SELECT FROM字段列表有些類似。優化

如今咱們來看看查詢部分。之前,咱們已經看過如何使用match_all查詢來匹配全部文檔。如今咱們來介紹一個叫作匹配查詢(match query)的新查詢,這個查詢能夠被看做是基本的搜索查詢(即針對特定字段或者字段集合進行的搜索)。ui

GET /bank/_search
{
  "query": { "match": { "account_number": 20 } }
}複製代碼

此示例返回地址中包含術語「mill」的全部賬戶:spa

GET /bank/_search
{
  "query": { "match": { "address": "mill" } }
}複製代碼

此示例返回地址中包含術語「mill」或「lane」的全部賬戶:翻譯

GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}複製代碼

這個例子是matchmatch_phrase)的一個變體,返回在地址中包含短語「mill lane」的全部帳號:code

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查詢以外,還有不少其餘查詢類型可用,咱們不在這裏介紹。因爲咱們已經對其工做原理有了一個基本的瞭解,因此將這些知識應用於其餘查詢類型的學習和實驗並不難。

相關文章
相關標籤/搜索