一、 搜尋
1.DSL搜尋
全部資料沒有任何條件
GET /shop/goods/_search { "query": { "match_all": {} } }
查詢名稱包含 xxx 的商品,同時按照價格降序排序
GET /shop/goods/_search { "query" : { "match" : { "name" : "xxx" } }, "sort": [ { "price": "desc" } ] }
分頁查詢商品 from 第幾條開始 size 獲取幾條
GET /shop/goods/_search { "query" : { "match" : { "name" : "xxx" } }, "from": 1, "size": 1 }
查詢結果中返回的欄位 設定
查詢結果中返回的欄位 設定 GET /shop/goods/_search { "query" : { "match" : { "name" : "xxx" } }, "_source": ["name", "price"] }
2、query filter
搜尋商品名稱包含xxx,而且售價大於25元的商品
GET /shop/goods/_search { "query" : { "bool" : { "must" : { "match" : { "name" : "xxx" } }, "filter" : { "range" : { "price" : { "gt" : 25 } } } } } }
3、full-text search(全文檢索)
GET /shop/goods/_search { "query" : { "match" : { "producer" : "xxx" } } }
4、phrase search(短語搜尋)
短語搜尋的功能和全文檢索相對應,全文檢索會將輸入的搜尋串拆解開來,去倒排索引裡面去一一匹配,只要能匹配上任意一個拆解後的單詞,就可以作為結果返回
phrase search,要求輸入的搜尋串,必須在指定的欄位文字中,完全包含一模一樣的,才可以算匹配,才能作為結果返回
GET /shop/goods/_search { "query" : { "match_phrase" : { "producer" : "xxx" } } }
5 highlight search(高亮搜尋結果)
高亮優化:
方式1:傳統plain高亮方式。
官網明確支援,該方式匹配慢,如果出現效能問題,請考慮其他高亮方式。
方式2: postings 高亮方式。
方式3: fast-vector-highlighter 簡稱fvh高亮方式。
GET /shop/goods/_search { "query" : { "match" : { "producer" : "xxx" } }, "highlight": { "fields" : { "producer" : {} } } }
二、 聚合、分析
5.x以後對排序,聚合這些操作用單獨的資料結構(fielddata)快取到記憶體裡了,需要單獨開啟。
開啟欄位的fielddata
PUT /shop/_mapping/goods { "properties": { "tags": { "type": "text", "fielddata": true } } }
1、計算每個tag下的商品數量
GET /shop/goods/_search { "aggs": { "group_by_tags": { "terms": { "field": "tags" } } } }
size表示不返回文件 只返回聚合分析後的結果 group_by_tags和all_tags 只是給本次聚合 起一個名字 沒有功能的區別
GET /shop/goods/_search { "size": 0, "aggs": { "all_tags": { "terms": { "field": "tags" } } } }
2、對名稱中包含xxx的商品,計算每個tag下的商品數量
GET /shop/goods/_search { "size": 0, "query": { "match": { "name": "yagao" } }, "aggs": { "all_tags": { "terms": { "field": "tags" } } } }
3、先分組,再算每組的平均值,計算每個tag下的商品的平均價格
GET /shop/goods/_search { "size": 0, "aggs" : { "group_by_tags" : { "terms" : { "field" : "tags" }, "aggs" : { "avg_price" : { "avg" : { "field" : "price" } } } } } }
4、計算每個tag下的商品的平均價格,並且按照平均價格降序排序
GET /shop/goods/_search { "size": 0, "aggs" : { "all_tags" : { "terms" : { "field" : "tags", "order": { "avg_price": "desc" } }, "aggs" : { "avg_price" : { "avg" : { "field" : "price" } } } } } }
5、按照指定的價格範圍區間進行分組,然後在每組內再按照tag進行分組,最後再計算每組的平均價格
GET /shop/goods/_search { "size": 0, "aggs": { "group_by_price": { "range": { "field": "price", "ranges": [ { "from": 0, "to": 20 }, { "from": 20, "to": 40 }, { "from": 40, "to": 50 } ] }, "aggs": { "group_by_tags": { "terms": { "field": "tags" }, "aggs": { "average_price": { "avg": { "field": "price" } } } } } } } }