Elasticsearch(ES)多種查詢方式案例
1. Elasticsearch的查詢方式
Elasticsearch(ES)提供了多種查詢方式,可以根據不同的需求和場景選擇合適的查詢類型。
2. 常用的ES查詢方式
Match Query(匹配查詢): 根據字段中的內容進行全文匹配查詢,可以使用
match、multi_match
等。Term Query(精確查詢): 根據字段中的精確值進行查詢,適用于keyword類型或者已經執(zhí)行過分詞器的字段。
Range Query(范圍查詢): 根據字段中的范圍值進行查詢,可以用來查詢數字或日期范圍,例如大于、小于、范圍內等。
Bool Query(布爾查詢): 通過邏輯運算符(
must、must_not、should
)組合多個查詢條件,實現(xiàn)更復雜的查詢邏輯。Match Phrase Query(短語匹配查詢): 根據字段中連續(xù)的短語進行查詢,適用于需要保持短語順序的查詢。
Prefix Query(前綴查詢): 根據字段中的前綴進行查詢,適用于需要按照前綴匹配查詢的場景。
Wildcard Query(通配符查詢): 根據通配符模式進行查詢,支持通配符符號(
*
和?
)進行模糊匹配。Fuzzy Query(模糊查詢): 根據字段中的模糊匹配進行查詢,可以通過設置fuzziness參數來控制模糊程度。
Nested Query(嵌套查詢): 根據嵌套對象進行查詢,以便查詢嵌套在文檔中的相關信息。
Aggregation Query(聚合查詢): 用于計算、統(tǒng)計和分析數據,包括求和、平均值、最小值、最大值、分組等操作。
以上只是一些常見的查詢方式,ES還提供了更多的查詢類型和功能,如復雜查詢、地理位置查詢、正則表達式查詢等,可根據實際需求選擇合適的查詢方式。
3. 查詢案例
下面是一個包含各種查詢案例的示例:
3.1 products的索引
product_name:產品名稱,類型為text
category:產品類別,類型為keyword
price:產品價格,類型為float
description:產品描述,類型為text
tags:產品標簽,類型為keyword
創(chuàng)建索引products:
PUT /products { "settings": { "number_of_shards": 1, "number_of_replicas": 1 }, "mappings": { "properties": { "product_name": { "type": "text" }, "category": { "type": "keyword" }, "price": { "type": "float" }, "description": { "type": "text" }, "tags": { "type": "keyword" } } } }
創(chuàng)建了一個名為products的索引。 number_of_shards定義了主分片數為1。
number_of_replicas定義了副本數為1。 mappings定義了索引中的字段類型和屬性。
3.2 Match Query(匹配查詢)
POST /products/_search { "query": { "match": { "product_name": "laptop" } } }
使用match查詢來進行全文匹配查詢。 在product_name字段中匹配關鍵詞"laptop"。
返回與"laptop"相關度最高的文檔。
3.3 Term Query(精確查詢)
POST /products/_search { "query": { "term": { "category": "electronics" } } }
使用term查詢進行精確匹配查詢。 在category字段中精確匹配"electronics"。
返回與"electronics"完全一致的文檔。
3.4 Range Query(范圍查詢)
POST /products/_search { "query": { "range": { "price": { "gte": 100, "lte": 500 } } } }
使用range查詢進行范圍查詢。 在price字段中查詢價格在100到500之間的文檔。 返回價格在100到500之間的文檔。
3.5 Bool Query(布爾查詢)
POST /products/_search { "query": { "bool": { "must": [ { "match": { "product_name": "laptop" } }, { "term": { "category": "electronics" } } ], "must_not": [ { "range": { "price": { "gte": 2000 } } } ], "should": [ { "match": { "description": "lightweight" } }, { "match": { "tags": "portable" } } ] } } }
使用bool查詢進行多條件查詢邏輯。
must子句中同時滿足product_name為"laptop"和category為"electronics"的文檔。
must_not子句中排除價格大于等于2000的文檔。
should子句中滿足description包含"lightweight"或tags包含"portable"的文檔。
返回符合以上條件的文檔。
3.6 Match Phrase Query(短語匹配查詢)
POST /products/_search { "query": { "match_phrase": { "product_name": "red laptop" } } }
使用match_phrase查詢進行短語匹配查詢。 在product_name字段中匹配短語"red laptop"。 返回包含短語"red
laptop"的文檔。
3.7 Prefix Query(前綴查詢)
POST /products/_search { "query": { "prefix": { "product_name": "ca" } } }
使用prefix查詢進行前綴匹配查詢。 在product_name字段中匹配以"ca"開頭的文檔。 返回以"ca"開頭的產品名稱的文檔。
3.8 Wildcard Query(通配符查詢)
POST /products/_search { "query": { "wildcard": { "product_name": "l*t" } } }
使用wildcard查詢進行通配符模式匹配查詢。 在product_name字段中匹配帶有"l"和"t"之間任意字符的文檔。
返回符合通配符模式的文檔。
3.9 Fuzzy Query(模糊查詢)
POST /products/_search { "query": { "fuzzy": { "product_name": { "value": "laptop", "fuzziness": 2 } } } }
使用fuzzy查詢進行模糊匹配查詢。 在product_name字段中匹配與"laptop"相似的文檔。
fuzziness參數設置了相似度為2。 返回與"laptop"相似的文檔。
3.10 Nested Query(嵌套查詢)
POST /products/_search { "query": { "nested": { "path": "reviews", "query": { "match": { "reviews.comment": "good" } } } } }
使用nested查詢進行嵌套查詢。 在reviews嵌套字段中根據reviews.comment字段的值查詢"good"的文檔。
返回包含滿足嵌套查詢條件的文檔。
3.11 Aggregation Query(聚合查詢)
POST /products/_search { "size": 0, "aggregations": { "avg_price": { "avg": { "field": "price" } }, "max_price": { "max": { "field": "price" } }, "category_count": { "terms": { "field": "category" } } } }
使用aggregations進行聚合查詢。 avg聚合計算了price字段的平均值。 max聚合計算了price字段的最大值。
terms聚合按category字段進行分組統(tǒng)計。 返回計算和統(tǒng)計結果,包括平均價格、最高價格和每個分類的文檔數量。
附:時間范圍查詢
簡單示例
GET /_search { "query": { "range": { "timestamp": { "gte": "now-1d/d", // 當前時間的上一天, 四舍五入到最近的一天 "lte": "now/d" // 當前時間, 四舍五入到最近的一天 } } } }
總結
到此這篇關于Elasticsearch(ES)多種查詢方式的文章就介紹到這了,更多相關ES多種查詢方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決SpringBoot返回結果如果為null或空值不顯示處理問題
這篇文章主要介紹了解決SpringBoot返回結果如果為null或空值不顯示處理問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Java synchronized關鍵字和Lock接口實現(xiàn)原理
這篇文章主要介紹了Java synchronized關鍵字和Lock接口實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12