samwellwang

samwellwang

coder
twitter

ES 查詢語句

Elasticsearch#

Elasticsearch 是一種基於 Lucene 的分佈式搜索引擎,就是那個能快速、準確地找到大量數據的搜索引擎。它的查詢語言 DSL 可不是一般的強大,支持各種查詢方式,比如 bool、match、term、must、should 等等,還能做聚合查詢和 plainless 腳本。咱們今天就來學學怎麼用這些語句在 ES 裡找到想要的數據,讓工作變得更加高效。比如說,你要找到某個客戶的訂單記錄,或者查看某個時間段內的銷售數據,ES 就能輕鬆搞定。總之,ES 可不是一般的好用,學會了這些語法和技巧,你的增刪改查就更得心應手啦!(再也不用去改別人的查詢 DSL 了

  1. 查詢語法

ES 的查詢語法主要包括以下幾個部分:查詢類型、查詢條件、過濾條件和排序條件。其中,查詢類型包括 match、term、bool 等,查詢條件指定要查詢的字段和關鍵字,過濾條件用於對查詢結果進行過濾,排序條件用於對查詢結果進行排序。

1.1 match 查詢

match 查詢是 ES 中最常用的一種查詢方式,用於在指定字段中查找包含指定關鍵字的文檔。例如,要查找包含「Elasticsearch」關鍵字的文檔,可以使用如下 DSL 語句:

{
  "query": {
    "match": {
      "content": "Elasticsearch"
    }
  }
}

其中,「content」是要查詢的字段名,「Elasticsearch」是要查找的關鍵字。如果想要在多個字段中查找關鍵字,可以使用如下語句:

{
  "query": {
    "multi_match": {
      "query": "Elasticsearch",
      "fields": ["title", "content"]
    }
  }
}

1.2 term 查詢

term 查詢用於精確匹配某個字段的值。例如,要查找「status」字段值為「published」的文檔,可以使用如下 DSL 語句:

{
  "query": {
    "term": {
      "status.keyword": "published"
    }
  }
}

需要注意的是,如果要查詢 keyword 類型的字段,需要在字段名後加上「.keyword」。

1.3 bool 查詢

bool 查詢用於組合多個查詢條件,並支持 must、should、must_not 三種邏輯關係。例如,要查找「title」字段中包含「Elasticsearch」關鍵字且「status」字段值為「published」的文檔,可以使用如下 DSL 語句:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } },
        { "term": { "status.keyword": "published" } }
      ]
    }
  }
}

需要注意的是,must 和 should 不能並列使用。:)

  1. 聚合查詢

聚合查詢是 ES 中非常有用的一種功能,它可以對查詢結果進行分組、統計、排序等操作。ES 支持多種聚合方式,包括 terms、range、date_histogram 等。

2.1 terms 聚合

terms 聚合用於對某個字段進行分組統計。例如,要對「category」字段進行分組統計,可以使用如下 DSL 語句:

{
  "aggs": {
    "group_by_category": {
      "terms": {
        "field": "category.keyword"
      }
    }
  }
}

其中,「group_by_category」是聚合名稱,「category.keyword」是要進行聚合的字段名。

2.2 range 聚合

range 聚合用於對某個字段進行範圍統計。例如,要對「price」字段進行範圍統計,可以使用如下 DSL 語句:

{
  "aggs": {
    "price_range": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 50 },
          { "from": 50, "to": 100 },
          { "from": 100 }
        ]
      }
    }
  }
}

其中,「price_range」是聚合名稱,「price」是要進行聚合的字段名,「ranges」指定了要統計的範圍。

  1. 進階技巧

除了基本的查詢和聚合操作外,ES 還支持一些進階技巧,包括 plainless 腳本、nested 查詢等。

3.1 painless 腳本

painless 腳本是 ES 中內置的一種腳本語言,支持類似 Java 的語法,並提供了豐富的 API 接口。通過使用 painless 腳本,可以實現更加複雜的數據處理和計算操作。例如,在查詢結果中添加一個新的字段「score」,可以使用如下 DSL 語句:

{
  "query": {
    "match_all": {}
  },
  "script_fields": {
    "score": {
      "script": {
        "lang": "painless",
        "source": "_score * doc['price'].value"
      }
    }
  }
}

其中,「_score」表示文檔得分,「doc ['price'].value」表示獲取「price」字段的值。

3.2 nested 查詢

nested 查詢用於對嵌套在文檔中的子文檔進行查詢。例如,在一個博客系統中,每篇文章可能包含多個評論,每個評論都是一個嵌套在文章中的子文檔。要查詢所有評論中包含「Elasticsearch」的文章,可以使用如下 DSL 語句:

{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "match": {
          "comments.content": "Elasticsearch"
        }
      }
    }
  }
}

其中,「comments」是子文檔名稱,「content」是子文檔中要查詢的字段名。

  1. 注意事項

在使用 ES 進行增刪改查時,需要注意以下幾點:

  • 搜索 keyword 類型的字段時需要在字段名後加上「.keyword」
  • 嵌套查詢時需要使用 nested 查詢
  • must 和 should 不能並列使用
  • 使用 painless 腳本時需要注意安全性和性能問題

總之,在使用 ES 進行增刪改查時,需要熟練掌握其 DSL 語句的相關語法和技巧,並注意避免可能遇到的坑。希望本文能夠對您有所幫助!

  1. 參考資料
    以上 es 的版本是 6.8.17,我還用過 es 7 版本的,為了支持向量類型字段的搜索。以後單開一篇記錄吧
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。