為方便后續查詢演示,我們先創建一個索引。創建索引請求如下:
插入一下數據:
可以按照如下方式插入數據:
1 基礎查詢¶
ES中提供以下四種最基本的方式進行文檔檢索操作:
GET <index>/_doc/<_id>
HEAD <index>/_doc/<_id>
GET <index>/_source/<_id>
HEAD <index>/_source/<_id>
其中GET請求方式獲取所有詳細信息,包括我們存儲在ES中的字段數據和文檔的元數據;HEAD方式用於查詢文檔是否存在。路由中_doc
表示默認返回所有信息,_source
表示只返回字段數據。
通過GET方法獲取文檔所有數據信息:
如果不想查詢_source
部分內容,那么,可以傳遞參數_source=false
:
只查詢_source
中的內容:
可以通過_source_includes
來設置查詢顯示哪些字段,如下所示只顯示user.name和user.age兩個字段:
也可以通過_source_exclude
來設置不顯示哪些字段,如下所示,將user.id字段過濾排除:
通過HEAD查看文檔是否存在:
當返回狀態碼為200時,表示文檔存在,返回狀態碼為404時,表示文檔不存在。當使用HEAD /poet/_source/1
時表示查詢_id
為1的文檔是否存在_source
。
2 進階查詢¶
在基礎查詢中,使用的是_id
這個唯一標識進行數據篩選,但這遠遠滿足不了實際應用需要,所以,ES中提供了search API進行更豐富功能的文檔檢索操作。search API的釋放方式如下:
GET /索引庫名/_search
{
"query": {
"查詢類型": {
"查詢條件": "查詢條件值"
}
}
}
查詢類型包括match_all,match,term,range,fuzzy,bool 等等,而查詢條件會根據類型的不同,寫法也有差異。
2.1 查詢所有(match_all)¶
如下所示,查詢出索引poet中所有的文檔(截圖並未顯示全部):
通過_source
字段可以設置只顯示部分字段(本篇后續所有查詢都可以通過這一方式設置顯示哪些字段):
可以進一步傳遞from
和size
參數設置顯示哪一步分數據,實現類似於分頁的功能,日中from
表示從第幾個文檔開始顯示(注意,下標開始於0,from為0時表示從第一個文檔開始顯示),size
表示共顯示多少個文檔。
2.2 匹配查詢(match)¶
使用match關鍵字進行匹配查詢,如果所匹配的字段是text
類型,那么,那么,ES會對查詢字符串進行分成多個詞條,如果查詢時設置operator
值為or
表示多個詞條是“或”的關系,如果operator
值為and
,那么多個詞條間就必須是“且”的關系。
如果所匹配的字段是keyword
類型,那么,operator
關鍵字將失去意義,無論是否設置,或者設置成or
或者and
都將進行精確匹配。當然,一般來說,不建議使用match
來對keyword
類型字段進行查詢,match
是針對text
類型字段而設計的。下面要說的詞條查詢才是對keyword
等類型字段查詢設計的。
2.3 詞條查詢(term、terms)¶
詞條查詢是專用於精確匹配的一種查詢,一般用於keyword
等字符串型或者數值型字段的精確匹配,注意,官方提醒,不要將詞條匹配用於text
類型的字段查詢中。
(1) 單詞條查詢:term
(2) 多詞條查詢:terms
2.3 范圍查詢(range)¶
范圍查詢是指對數值型、日期等類型字段是否在或不在某個范圍內進行查詢,用於范圍判斷的標識包含以下幾個:
-
gt: 大於
-
gte: 大於等於
-
lt:小於
-
lte:小於等於
舉例來說,查詢字段“die_age”大於等於60小於等於70的所有文檔:
3 布爾查詢(多條件符合查詢)¶
上述介紹的查詢方法只能進行一條語句(一個條件)情況下的查詢,ES中提供而布爾查詢機制,可進行多條件下過濾查詢。布爾查詢需要結合以下幾個條件子句類使用:
-
must:必須滿足的條件(類似於SQL中的and)
-
should:可以滿足也可以不滿足的條件(類似於SQL中的or)
-
must_not:不需要滿足的條件(類似於SQL中的not)
進一步的,可以在上述三個查詢子句的基礎上,配合filter
子句對結果進一步過濾。filter
子句的有點在於不對結果相關度進行評分,提高查詢性能。
例1:名字里有李或者杜,不能是浪漫主義詩人
例2:名字里有李或者杜,不能是浪漫主義詩人,且性別是女,享年大於60