elasticsearch結構化查詢過濾語句-----4


1、之前三節講述的都是索引結構及內容填充的部分,既然添加了數據那我們的目的無非就是增產改查crudp,我先來講講查詢-----結構化查詢

  我們看上圖截圖兩種方式:

  1)第一種,在索引index5類型school下面定義一個查詢query(這就是內嵌查詢的關鍵字),query內部嵌套一個match根據指定field也就是字段查找其內容包含的關鍵字hawal。

  2)第二種,在索引index5類型school下面定義一個查詢query(這就是內嵌查詢的關鍵字),query內部嵌套一個match_all,不指定任何字段任何條件,就相當於查詢所有內容,相當於GET /index5/school/_search

 

2、復雜嵌套查詢

  在關系型數據庫中有很多條件判斷,比如 等於=  不等於!=等等,在es中同樣有相應解決方案:

  1)must  需要滿足條件  ==或like

  2)must_not  不需要在滿足條件內的 !=或 not like

  我們舉例查詢,在索引index5中查詢滿足條件name字段包含hawal的,id字段不是12開頭或包含12的,寫成sql大概是where name like '%hawal%' and id not like '%12%'

  es中是這么表達的,同樣定義一個query查詢嵌套塊,里面定義一個bool(和query一樣是es內嵌關鍵字)的嵌套,name字段must為hawal,id字段must_not為12的。

  

3、term過濾

  注意哦,這里是精確匹配,大小寫什么都很嚴格,我們查詢/index5索引下,name值為hawal或Hawal的查詢有兩種結果,請看:

  

  看上圖,索引中name存的是"Hawal",我們用Hawal"精准"的去匹配匹配不到,用hawal去匹配反而匹配到了,這是為什么呢?因為索引這行數據的時候分析其默認幫我們全轉換成了小寫,所以大寫H開頭的Hawal搜索不到,這,不知道是我理解有誤還是es這么做有其他原理?

    

4、terms過濾(多值匹配)

  

5、range過濾

  上圖查詢索引index5下subject下id大於或等於1002的所有內容

  范圍操作符包含:

        

6、exists和missing過濾

  exists 和 missing 過濾可以用於查找文檔中是否包含指定字段或沒有某個字段,類似於SQL語句中的 IS_NULL 條件

  我們舉個例子,查找索引index5下name字段不為空的內容

  

  其實就是指定field(字段)去查name字段不為空的內容,missing就不舉例了。

 

7、bool過濾

  見本篇第二小節,must,must_not,should

 

8、match_all語句

  GET /index5/_search
  {
    "query": {
      "match_all": {}
      }
  }

  其實就相當於GET /index5/_search

9、帶過濾的查詢語句

  如我現在精確匹配索引index5下name包含mit的內容

  GET /index5/_search
  {
    "query":{
    "term":{
      "subject.subject-name":"computer"
       }
    }
  }

  但是我同時向加入另一條過濾,在匹配subject.subject-name包含"computer"的同時還需要過濾subject.students大於1002的內容

  

  

  我們看上圖執行結果,索引/index5中subject.subject-name字段匹配computer的內容,然后過濾掉里面subject.students大於1002的內容,這里所有結果的students都小於1002,所以均返回了。

  那我們可以很好的理解query和filter的區別,query是現實匹配的,filter是在已匹配的內容里面過濾掉滿足fiter條件的內容。

  請注意------es 5.x往后的版本去掉了filters語法,統一采用bool嵌套filter的語法。

10、驗證查詢

  有時候我們寫了一個查詢語句,但是可能由於語法錯誤或指定查詢的字段不存在報了一堆錯誤,但是提示信息並不明顯,這時es給我們提供了一個校驗請求語法的功能,其實就是在執行前先會幫忙校驗一下語法是否正確,並會給出相關提示信息:

  比如我要查詢索引index5下所有name字段中包含“tinghua”的內容,但這是我把內嵌查詢query字段拼成了qery,這時就該提示Unknown key for a START_OBJECT in [qery]。

  

  其實,我們可以先對查詢體做校驗,在請求體后加上/_validate/query即可:

  

 

  可以看到右邊的校驗結果為false,想看到更具體的結果,加上?explain即可

  

 

  如果校驗成功,我們會看到es的索引結果,如你用的分析器將你需要搜索的內容拆分成幾個字段,在哪些索引中查找到內容都能看到:

  

 

 


免責聲明!

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



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