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的索引結果,如你用的分析器將你需要搜索的內容拆分成幾個字段,在哪些索引中查找到內容都能看到: