ElasticSearch查詢文檔基本操作實例
查詢文檔 & 基本操作
為了方便學習, 本節(jié)中所有示例沿用上節(jié)的索引
按照ID單個
GET class_1/_doc/1
查詢結果:
{ "_index" : "class_1", "_type" : "_doc", "_id" : "1", "_version" : 4, "_seq_no" : 4, "_primary_term" : 3, "found" : true, "_source" : { "name" : "l", "num" : 6 } }
按照ID批量
GET class_1/_mget { "ids":[1,2,3] }
返回:
{ "docs" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "1", "_version" : 4, "_seq_no" : 4, "_primary_term" : 3, "found" : true, "_source" : { "name" : "l", "num" : 6 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "2", "found" : false }, { "_index" : "class_1", "_type" : "_doc", "_id" : "3", "_version" : 3, "_seq_no" : 10, "_primary_term" : 4, "found" : true, "_source" : { "num" : 9, "name" : "e", "age" : 9, "desc" : [ "hhhh" ] } } ] }
查詢文檔是否存在 & 通過id判斷
HEAD class_1/_doc/1
返回:
200 - OK
HEAD class_1/_doc/1000
返回:
404 - Not Found
查詢部分字段內容
GET class_1/_doc/1?_source_includes=name
返回:
{ "_index" : "class_1", "_type" : "_doc", "_id" : "1", "_version" : 4, "_seq_no" : 4, "_primary_term" : 3, "found" : true, "_source" : { "name" : "l" } }
可以看到只返回了name
字段, 以上是一個基本的操作,下面給大家講下條件查詢~
查詢文檔 & 條件查詢
查詢的復雜度取決于它附加的條件約束,跟我們寫sql
一樣。下面就帶大家一步一步看一下ES
中如何進行條件查詢~
不附加任何條件
GET class_1/_search
返回:
{ "took" : 15, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 8, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "h2Fg-4UBECmbBdQA6VLg", "_score" : 1.0, "_source" : { "name" : "b", "num" : 6 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "iGFt-4UBECmbBdQAnVJe", "_score" : 1.0, "_source" : { "name" : "g", "age" : 8 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "iWFt-4UBECmbBdQAnVJg", "_score" : 1.0, "_source" : { "name" : "h", "age" : 9 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "imFt-4UBECmbBdQAnVJg", "_score" : 1.0, "_source" : { "name" : "i", "age" : 10 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "num" : 9, "name" : "e", "age" : 9, "desc" : [ "hhhh" ] } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "4", "_score" : 1.0, "_source" : { "name" : "f", "age" : 10, "num" : 10 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "RWlfBIUBDuA8yW5cu9wu", "_score" : 1.0, "_source" : { "name" : "一年級", "num" : 20 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "name" : "l", "num" : 6 } } ] } }
可以看到索引class_1
中的所有數(shù)據(jù)都是上節(jié)添加的。這里提一下,我們也可以添加多個索引一起查,然后返回,用,逗號
隔開就可以了
GET class_1,class_2,class_3/_search
{ "took" : 7, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 9, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "h2Fg-4UBECmbBdQA6VLg", "_score" : 1.0, "_source" : { "name" : "b", "num" : 6 } }, { "_index" : "class_2", "_type" : "_doc", "_id" : "RWlfBIUBDuA8yW5cu9wu", "_score" : 1.0, "_source" : { "name" : "一年級", "num" : 20 } }, .... ] } }
可以看到返回了索引class_2
中的數(shù)據(jù),并且合并到了一起。
相關字段解釋
有的小伙伴可能對返回的字段有點陌生,這里給大家統(tǒng)一解釋一下:
{ "took":"查詢操作耗時,單位毫秒", "timed_out":"是否超時", "_shards":{ "total":"分片總數(shù)", "successful":"執(zhí)行成功分片數(shù)", "skipped":"執(zhí)行忽略分片數(shù)", "failed":"執(zhí)行失敗分片數(shù)" }, "hits":{ "total":{ "value":"條件查詢命中數(shù)", "relation":"計數(shù)規(guī)則(eq計數(shù)準確/gte計數(shù)不準確)" }, "max_score":"最大匹配度分值", "hits":[ { "_index":"命中結果索引", "_id":"命中結果ID", "_score":"命中結果分數(shù)", "_source":"命中結果原文檔信息" } ] } }
下面我們看下帶條件的查詢~
基礎分頁查詢
基本語法: es
中通過參數(shù)size
和from
來進行基礎分頁
的控制
from
:指定跳過
多少條數(shù)據(jù)size
:指定返回
多少條數(shù)據(jù)
下面看下示例:
url參數(shù)
GET class_1/_search?from=2&size=2
返回:
{ "took" : 5, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 8, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "iWFt-4UBECmbBdQAnVJg", "_score" : 1.0, "_source" : { "name" : "h", "age" : 9 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "imFt-4UBECmbBdQAnVJg", "_score" : 1.0, "_source" : { "name" : "i", "age" : 10 } } ] } }
body 參數(shù)
GET class_1/_search { "from" : 2, "size" : 2 }
返回結果和上面是一樣的~
單字段全文索引查詢
這個大家應該不陌生,前面幾節(jié)都見過。使用query.match
進行查詢,match
適用與對單個字段基于全文索引進行數(shù)據(jù)檢索。對于全文字段,match
使用特定的分詞
進行全文檢索。而對于那些精確值,match
同樣可以進行精確匹配,match
查詢短語時,會對短語進行分詞,再針對每個詞條進行全文檢索。
GET class_1/_search { "query": { "match": { "name":"i" } } }
返回:
{ "took" : 4, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.3862942, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "imFt-4UBECmbBdQAnVJg", "_score" : 1.3862942, "_source" : { "name" : "i", "age" : 10 } } ] } }
單字段不分詞查詢
使用query.match_phrase
進行查詢, 它與match
的區(qū)別就是不進行分詞,干說,可能有點抽象,下面我們通過一個例子給大家分清楚:
先造點數(shù)據(jù)進去:
PUT class_1/_bulk { "create":{ } } {"name":"I eat apple so haochi1~","num": 1} { "create":{ } } { "name":"I eat apple so zhen haochi2~","num": 1} { "create":{ } } {"name":"I eat apple so haochi3~","num": 1}
假設有這么幾個句子,現(xiàn)在我有一個需求我要把I eat apple so zhen haochi2~
這句話匹配出來
match分詞結果
GET class_1/_search { "query": { "match": { "name": "apple so zhen" } } }
返回:
{ "took" : 15, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : 2.2169428, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "cMfcCoYB090miyjed7YE", "_score" : 2.2169428, "_source" : { "name" : "I eat apple so zhen haochi2~", "num" : 1 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "b8fcCoYB090miyjed7YE", "_score" : 1.505254, "_source" : { "name" : "I eat apple so haochi1~", "num" : 1 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "ccfcCoYB090miyjed7YE", "_score" : 1.505254, "_source" : { "name" : "I eat apple so haochi3~", "num" : 1 } } ] } }
從結果來看,剛剛的幾句話都被查出來了,但是結果并大符合預期。從score
來看,"_score" : 2.2169428
得分最高,排在了第一,語句是I eat apple so zhen haochi2~
,說明匹配度最高,這個句子正是我們想要的結果~
match_phrase 不分詞查詢結果
GET class_1/_search { "query": { "match_phrase": { "name": "apple so zhen" } } }
結果:
{ "took" : 6, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 2.2169428, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "cMfcCoYB090miyjed7YE", "_score" : 2.2169428, "_source" : { "name" : "I eat apple so zhen haochi2~", "num" : 1 } } ] } }
結果符合預期,只返回了我們想要的那句。那么match
為什么都返回了,這就是前面講到的分詞
,首先會對name: apple so zhen
進行分詞,也就是說存在apple
的都會被返回。
當然,真正業(yè)務中的需求比這個復雜多了,這里只是為了給大家做區(qū)分~ 下面接著看~
多字段全文索引查詢
相當于對多個字段執(zhí)行了match
查詢, 這里需要注意的是query
的類型要和字段類型一致,不然會報類型異常
GET class_1/_search { "query": { "multi_match": { "query": "apple", "fields": ["name","desc"] } } }
{ "took" : 5, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : 0.752627, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "b8fcCoYB090miyjed7YE", "_score" : 0.752627, "_source" : { "name" : "I eat apple so haochi1~", "num" : 1 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "ccfcCoYB090miyjed7YE", "_score" : 0.752627, "_source" : { "name" : "I eat apple so haochi3~", "num" : 1 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "cMfcCoYB090miyjed7YE", "_score" : 0.7389809, "_source" : { "name" : "I eat apple so zhen haochi2~", "num" : 1 } } ] } }
范圍查詢
使用range
來進行范圍查詢,適用于數(shù)組
,時間
等字段
GET class_1/_search { "query": { "range": { "num": { "gt": 5, "lt": 10 } } } }
返回:
{ "took" : 6, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "h2Fg-4UBECmbBdQA6VLg", "_score" : 1.0, "_source" : { "name" : "b", "num" : 6 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "num" : 9, "name" : "e", "age" : 9, "desc" : [ "hhhh" ] } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "name" : "l", "num" : 6 } } ] } }
單字段精確查詢
使用term
進行非分詞字段
的精確查詢。需要注意的是,對于那些分詞的字段,即使查詢的value
是一個完全匹配的短語,也無法完成查詢
GET class_1/_search { "query": { "term": { "num": { "value": "9" } } } }
返回:
{ "took" : 4, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "num" : 9, "name" : "e", "age" : 9, "desc" : [ "hhhh" ] } } ] } }
字段精確查詢 & 多值
與term一樣, 區(qū)別在于可以匹配一個字段的多個值,滿足一個即檢索成功
GET class_1/_search { "query": { "terms": { "num": [ 9, 1 ] } } }
返回:
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "num" : 9, "name" : "e", "age" : 9, "desc" : [ "hhhh" ] } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "b8fcCoYB090miyjed7YE", "_score" : 1.0, "_source" : { "name" : "I eat apple so haochi1~", "num" : 1 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "ccfcCoYB090miyjed7YE", "_score" : 1.0, "_source" : { "name" : "I eat apple so haochi3~", "num" : 1 } }, { "_index" : "class_1", "_type" : "_doc", "_id" : "cMfcCoYB090miyjed7YE", "_score" : 1.0, "_source" : { "name" : "I eat apple so zhen haochi2~", "num" : 1 } } ] } }
文檔包含字段查詢
為了確定當前索引有哪些文檔包含了對應的字段,es
中使用exists
來實現(xiàn)
GET class_1/_search { "query": { "exists": { "field": "desc" } } }
返回:
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "class_1", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "num" : 9, "name" : "e", "age" : 9, "desc" : [ "hhhh" ] } } ] } }
結束語
本節(jié)主要講了ES
中的文檔查詢API操作,該部分內容較多, 下節(jié)繼續(xù)給大家講,就先消化這么多~API
大家都不要去背,多敲幾遍就記住了,關鍵是多用,多總結 。
以上就是ElasticSearch查詢文檔基本操作實例的詳細內容,更多關于ElasticSearch查詢文檔的資料請關注腳本之家其它相關文章!
相關文章
Spring-AOP 靜態(tài)正則表達式方法如何匹配切面
這篇文章主要介紹了Spring-AOP 靜態(tài)正則表達式方法如何匹配切面的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot?@RestControllerAdvice注解對返回值統(tǒng)一封裝的處理方法
這篇文章主要介紹了SpringBoot?@RestControllerAdvice注解對返回值統(tǒng)一封裝,使用@RestControllerAdvice對響應進行增強,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09仿京東平臺框架開發(fā)開放平臺(包含需求,服務端代碼,SDK代碼)
現(xiàn)在開放平臺越來越多了,下面針對仿京東開放平臺框架,封裝自己的開放平臺,分享給大家。先感謝一下京東開放平臺的技術大佬們,下面從開放平臺需求,服務端代碼,SDK代碼三大塊進行分享2021-06-06