數據准備:
PUT /shop { "settings": { "number_of_shards": 3, "number_of_replicas": 2 } } PUT /shop/_mapping/goods { "properties": { "title": { "type": "text", "analyzer": "ik_max_word" }, "price": { "type": "float" }, "stock": { "type": "integer" } } } POST /shop/goods/_bulk {"index":{}} {"title": "小米8 全面屏游戲智能手機 6GB+64GB 黑色 全網通4G 雙卡雙待","price": 2299.00,"stock": 8800} {"index":{}} {"title": "OPPO Find X曲面全景屏 波爾多紅 8GB+128GB 全網通 移動聯通電信全網通4G 雙卡雙待手機","price": 4999.00,"stock": 5600} {"index":{}} {"title": "聯想(Lenovo)拯救者Y7000P英特爾酷睿 i7 15.6英寸游戲筆記本電腦(i7-8750H 8G 512G SSD GTX1060 144Hz黑)","price": 8599.00,"stock": 1900} {"index":{}} {"title": "TP-LINK TL-WDR5620 1200M 5G雙頻智能無線路由器 四天線智能wifi 穩定穿牆高速家用路由器","price": 109.00,"stock": 9970}
一、基本查詢
語法:
GET /索引庫名/_search { "query": { "查詢類型": { "查詢條件": "查詢條件值" } } }
查詢類型:match_all,match,term,range,fuzzy,bool 等等
查詢條件:查詢條件會根據類型的不同,寫法也有差異
1.1 查詢所有(match_all)
查詢指令:
GET /shop/_search { "query": { "match_all": {} } }
查詢結果:
{ "took": 13, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 4, "max_score": 1, "hits": [ { "_index": "shop", "_type": "goods", "_id": "P4EGtmgBBdkQnU_d8b7I", "_score": 1, "_source": { "title": "聯想(Lenovo)拯救者Y7000P英特爾酷睿 i7 15.6英寸游戲筆記本電腦(i7-8750H 8G 512G SSD GTX1060 144Hz黑)", "price": 8599, "stock": 1900 } }, { "_index": "shop", "_type": "goods", "_id": "QIEGtmgBBdkQnU_d-r6T", "_score": 1, "_source": { "title": "TP-LINK TL-WDR5620 1200M 5G雙頻智能無線路由器 四天線智能wifi 穩定穿牆高速家用路由器", "price": 109, "stock": 9970 } }, { "_index": "shop", "_type": "goods", "_id": "PYEGtmgBBdkQnU_d4b4m", "_score": 1, "_source": { "title": "小米8 全面屏游戲智能手機 6GB+64GB 黑色 全網通4G 雙卡雙待", "price": 2299, "stock": 8800 } }, { "_index": "shop", "_type": "goods", "_id": "PoEGtmgBBdkQnU_d6b4Q", "_score": 1, "_source": { "title": "OPPO Find X曲面全景屏 波爾多紅 8GB+128GB 全網通 移動聯通電信全網通4G 雙卡雙待手機", "price": 4999, "stock": 5600 } } ] } }
對查詢結果進行分頁
GET /shop/_search { "query": { "match_all": {} }, "from": 1, "size": 2 }
1.2 匹配查詢(match)
or 關系:會把查詢條件進行分詞,然后進行查詢,多個詞條之間是or的關系
查詢指令:
GET /shop/_search { "query": { "match": { "title": { "query": "小米手機", "operator": "or" } } } }
查詢結果:
{ "took": 3, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1.6051829, "hits": [ { "_index": "demo", "_type": "goods", "_id": "MIHNs2gBBdkQnU_d_r6o", "_score": 1.6051829, "_source": { "title": "華為手機", "price": "2199.00" } }, { "_index": "demo", "_type": "goods", "_id": "LYHJs2gBBdkQnU_dt75n", "_score": 0.2876821, "_source": { "title": "小米手機", "price": "1699.00" } } ] } }
and關系:會把查詢條件進行分詞,然后進行查詢,多個詞條之間是and的關系
查詢指令:
GET /shop/_search { "query": { "match": { "title": { "query": "小米手機", "operator": "and" } } } }
查詢結果:
{ "took": 10, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.92355466, "hits": [ { "_index": "shop", "_type": "goods", "_id": "PYEGtmgBBdkQnU_d4b4m", "_score": 0.92355466, "_source": { "title": "小米8 全面屏游戲智能手機 6GB+64GB 黑色 全網通4G 雙卡雙待", "price": 2299, "stock": 8800 } } ] } }
1.3 詞條查詢
單值查詢(term)
查詢指令:
GET /shop/_search { "query": { "term": { "price": 109.00 } } }
查詢結果:
{ "took": 3, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 1, "hits": [ { "_index": "shop", "_type": "goods", "_id": "QIEGtmgBBdkQnU_d-r6T", "_score": 1, "_source": { "title": "TP-LINK TL-WDR5620 1200M 5G雙頻智能無線路由器 四天線智能wifi 穩定穿牆高速家用路由器", "price": 109, "stock": 9970 } } ] } }
多值查詢(terms)
查詢指令:
GET /shop/_search { "query": { "terms": { "price": [8599.00,109.00] } } }
查詢結果:
{ "took": 15, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1, "hits": [ { "_index": "shop", "_type": "goods", "_id": "P4EGtmgBBdkQnU_d8b7I", "_score": 1, "_source": { "title": "聯想(Lenovo)拯救者Y7000P英特爾酷睿 i7 15.6英寸游戲筆記本電腦(i7-8750H 8G 512G SSD GTX1060 144Hz黑)", "price": 8599, "stock": 1900 } }, { "_index": "shop", "_type": "goods", "_id": "QIEGtmgBBdkQnU_d-r6T", "_score": 1, "_source": { "title": "TP-LINK TL-WDR5620 1200M 5G雙頻智能無線路由器 四天線智能wifi 穩定穿牆高速家用路由器", "price": 109, "stock": 9970 } } ] } }
二、結果過濾
默認情況下,elasticsearch在搜索的結果中,會把文檔中保存在 _source 的所有字段都返回。
如果我們只想獲取其中的部分字段,我們可以添加 _source 字段進行過濾
2.1 包含字段查詢(includes)
查詢指令:
GET /shop/_search { "query": { "match_all": {} }, "_source": { "includes": ["title","price"] } }
查詢結果:
{ "took": 4, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 4, "max_score": 1, "hits": [ { "_index": "shop", "_type": "goods", "_id": "P4EGtmgBBdkQnU_d8b7I", "_score": 1, "_source": { "price": 8599, "title": "聯想(Lenovo)拯救者Y7000P英特爾酷睿 i7 15.6英寸游戲筆記本電腦(i7-8750H 8G 512G SSD GTX1060 144Hz黑)" } }, { "_index": "shop", "_type": "goods", "_id": "QIEGtmgBBdkQnU_d-r6T", "_score": 1, "_source": { "price": 109, "title": "TP-LINK TL-WDR5620 1200M 5G雙頻智能無線路由器 四天線智能wifi 穩定穿牆高速家用路由器" } }, { "_index": "shop", "_type": "goods", "_id": "PYEGtmgBBdkQnU_d4b4m", "_score": 1, "_source": { "price": 2299, "title": "小米8 全面屏游戲智能手機 6GB+64GB 黑色 全網通4G 雙卡雙待" } }, { "_index": "shop", "_type": "goods", "_id": "PoEGtmgBBdkQnU_d6b4Q", "_score": 1, "_source": { "price": 4999, "title": "OPPO Find X曲面全景屏 波爾多紅 8GB+128GB 全網通 移動聯通電信全網通4G 雙卡雙待手機" } } ] } }
2.2 排除字段查詢(excludes)
查詢指令
GET /shop/_search { "query": { "match_all": {} }, "_source": { "excludes": "price" } }
查詢結果:
{ "took": 3, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 4, "max_score": 1, "hits": [ { "_index": "shop", "_type": "goods", "_id": "P4EGtmgBBdkQnU_d8b7I", "_score": 1, "_source": { "title": "聯想(Lenovo)拯救者Y7000P英特爾酷睿 i7 15.6英寸游戲筆記本電腦(i7-8750H 8G 512G SSD GTX1060 144Hz黑)", "stock": 1900 } }, { "_index": "shop", "_type": "goods", "_id": "QIEGtmgBBdkQnU_d-r6T", "_score": 1, "_source": { "title": "TP-LINK TL-WDR5620 1200M 5G雙頻智能無線路由器 四天線智能wifi 穩定穿牆高速家用路由器", "stock": 9970 } }, { "_index": "shop", "_type": "goods", "_id": "PYEGtmgBBdkQnU_d4b4m", "_score": 1, "_source": { "title": "小米8 全面屏游戲智能手機 6GB+64GB 黑色 全網通4G 雙卡雙待", "stock": 8800 } }, { "_index": "shop", "_type": "goods", "_id": "PoEGtmgBBdkQnU_d6b4Q", "_score": 1, "_source": { "title": "OPPO Find X曲面全景屏 波爾多紅 8GB+128GB 全網通 移動聯通電信全網通4G 雙卡雙待手機", "stock": 5600 } } ] } }
三、高級查詢
3.1 范圍查詢(range)
查詢找出那些落在指定區間內的數字或者時間
查詢指令:
GET /shop/_search { "query": { "range": { "price": { "gte": 2000, "lte": 5000 } } } }
查詢結果:
{ "took": 3, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1, "hits": [ { "_index": "shop", "_type": "goods", "_id": "PYEGtmgBBdkQnU_d4b4m", "_score": 1, "_source": { "title": "小米8 全面屏游戲智能手機 6GB+64GB 黑色 全網通4G 雙卡雙待", "price": 2299, "stock": 8800 } }, { "_index": "shop", "_type": "goods", "_id": "PoEGtmgBBdkQnU_d6b4Q", "_score": 1, "_source": { "title": "OPPO Find X曲面全景屏 波爾多紅 8GB+128GB 全網通 移動聯通電信全網通4G 雙卡雙待手機", "price": 4999, "stock": 5600 } } ] } }
range查詢允許以下操作符
3.2 布爾查詢(bool)
bool把各種其它查詢通過must(與)、must_not(非)、should(或)的方式進行組合
查詢指令:
GET /shop/_search { "query": { "bool": { "should": [ { "match": { "title": "筆記本" } }, { "term": { "price": 109.00 } } ] } } }
查詢結果:
{ "took": 15, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1.9646256, "hits": [ { "_index": "shop", "_type": "goods", "_id": "P4EGtmgBBdkQnU_d8b7I", "_score": 1.9646256, "_source": { "title": "聯想(Lenovo)拯救者Y7000P英特爾酷睿 i7 15.6英寸游戲筆記本電腦(i7-8750H 8G 512G SSD GTX1060 144Hz黑)", "price": 8599, "stock": 1900 } }, { "_index": "shop", "_type": "goods", "_id": "QIEGtmgBBdkQnU_d-r6T", "_score": 1, "_source": { "title": "TP-LINK TL-WDR5620 1200M 5G雙頻智能無線路由器 四天線智能wifi 穩定穿牆高速家用路由器", "price": 109, "stock": 9970 } } ] } }
四、過濾查詢
所有的查詢都會影響到文檔的評分及排名。如果我們需要在查詢結果中進行過濾,並且不希望過濾條件影響評分,
那么就不要把過濾條件作為查詢條件來用,而是使用filter方式。
查詢指令:
GET /shop/_search { "query": { "bool": { "must": [ { "match": { "title": "手機" } } ], "filter": { "range": { "price": { "gt": 3000 } } } } } }
查詢結果:
{ "took": 5, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.17329858, "hits": [ { "_index": "shop", "_type": "goods", "_id": "PoEGtmgBBdkQnU_d6b4Q", "_score": 0.17329858, "_source": { "title": "OPPO Find X曲面全景屏 波爾多紅 8GB+128GB 全網通 移動聯通電信全網通4G 雙卡雙待手機", "price": 4999, "stock": 5600 } } ] } }
注意:filter中還可以再次進行bool組合條件過濾。
五、排序查詢
sort 可以讓我們按照不同的字段進行排序,並且通過order指定排序的方式。
查詢指令:
GET /shop/_search { "query": { "match_all": {} }, "sort": [ { "price": { "order": "desc" } } ] }
查詢結果:
{ "took": 55, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": 4, "max_score": null, "hits": [ { "_index": "shop", "_type": "goods", "_id": "P4EGtmgBBdkQnU_d8b7I", "_score": null, "_source": { "title": "聯想(Lenovo)拯救者Y7000P英特爾酷睿 i7 15.6英寸游戲筆記本電腦(i7-8750H 8G 512G SSD GTX1060 144Hz黑)", "price": 8599, "stock": 1900 }, "sort": [ 8599 ] }, { "_index": "shop", "_type": "goods", "_id": "PoEGtmgBBdkQnU_d6b4Q", "_score": null, "_source": { "title": "OPPO Find X曲面全景屏 波爾多紅 8GB+128GB 全網通 移動聯通電信全網通4G 雙卡雙待手機", "price": 4999, "stock": 5600 }, "sort": [ 4999 ] }, { "_index": "shop", "_type": "goods", "_id": "PYEGtmgBBdkQnU_d4b4m", "_score": null, "_source": { "title": "小米8 全面屏游戲智能手機 6GB+64GB 黑色 全網通4G 雙卡雙待", "price": 2299, "stock": 8800 }, "sort": [ 2299 ] }, { "_index": "shop", "_type": "goods", "_id": "QIEGtmgBBdkQnU_d-r6T", "_score": null, "_source": { "title": "TP-LINK TL-WDR5620 1200M 5G雙頻智能無線路由器 四天線智能wifi 穩定穿牆高速家用路由器", "price": 109, "stock": 9970 }, "sort": [ 109 ] } ] } }