Elasticsearch#
Elasticsearch 是一種基於 Lucene 的分佈式搜索引擎,就是那個能快速、準確地找到大量數據的搜索引擎。它的查詢語言 DSL 可不是一般的強大,支持各種查詢方式,比如 bool、match、term、must、should 等等,還能做聚合查詢和 plainless 腳本。咱們今天就來學學怎麼用這些語句在 ES 裡找到想要的數據,讓工作變得更加高效。比如說,你要找到某個客戶的訂單記錄,或者查看某個時間段內的銷售數據,ES 就能輕鬆搞定。總之,ES 可不是一般的好用,學會了這些語法和技巧,你的增刪改查就更得心應手啦!(再也不用去改別人的查詢 DSL 了
- 查詢語法
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 不能並列使用。:)
- 聚合查詢
聚合查詢是 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」指定了要統計的範圍。
- 進階技巧
除了基本的查詢和聚合操作外,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」是子文檔中要查詢的字段名。
- 注意事項
在使用 ES 進行增刪改查時,需要注意以下幾點:
- 搜索 keyword 類型的字段時需要在字段名後加上「.keyword」
- 嵌套查詢時需要使用 nested 查詢
- must 和 should 不能並列使用
- 使用 painless 腳本時需要注意安全性和性能問題
總之,在使用 ES 進行增刪改查時,需要熟練掌握其 DSL 語句的相關語法和技巧,並注意避免可能遇到的坑。希望本文能夠對您有所幫助!
- 參考資料
以上 es 的版本是 6.8.17,我還用過 es 7 版本的,為了支持向量類型字段的搜索。以後單開一篇記錄吧