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