Elasticsearch(6):文檔查詢


 

為方便后續查詢演示,我們先創建一個索引。創建索引請求如下:

 

 

插入一下數據:

 

 

可以按照如下方式插入數據:

 

 

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字段可以設置只顯示部分字段(本篇后續所有查詢都可以通過這一方式設置顯示哪些字段):

 

 

可以進一步傳遞fromsize參數設置顯示哪一步分數據,實現類似於分頁的功能,日中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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM