_search
GET /_search
搜索所有的doucment并默認(rèn)返回10條document
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 16,
"successful": 16,
"failed": 0
},
"hits": {
"total": 17,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "test_type",
"_id": "AVsxkqabZ1jIX97EnDWz",
"_score": 1,
"_source": {
"test_filed": "auto_id"
}
},
... //10條document
]
}
}
部分字段說明:
- took:整個搜索請求花費(fèi)了多少毫秒
- hits.max_score:本次搜索的所有結(jié)果中,最大的相關(guān)度分?jǐn)?shù)是多少卡骂,每一條document對于search的相關(guān)度国裳,越相關(guān),_score分?jǐn)?shù)越大全跨,排位越靠前
- hits.hits:默認(rèn)返回10條完整的數(shù)據(jù)缝左,_score降序排列
- shards:shards fail的條件(primary和replica全部掛掉),不影響其他shard浓若。默認(rèn)情況下來說渺杉,一個搜索請求,會打到一個index的所有primary shard上去七嫌,當(dāng)然了少办,每個primary shard都可能會有一個或多個replic shard,所以請求也可以到primary shard的其中一個replica shard上去诵原。
- timeout:默認(rèn)無timeout英妓,可以手動指定timeout(timeout=10ms,timeout=1s绍赛,timeout=1m蔓纠,GET /_search?timeout=10m)
- timeout機(jī)制:指定每個shard,就只能在timeout時間范圍內(nèi)吗蚌,將搜索到的部分?jǐn)?shù)據(jù)(也可能全部都搜索到了)腿倚,直接立即返回給client程序,而不是等到所有的數(shù)據(jù)全部搜索出來以后再返回蚯妇,確保說敷燎,一次搜索請求可以在用戶指定的timeout時長內(nèi)完成。為一些時間敏感的搜索應(yīng)用提供良好的支持箩言。
multi-index和multi-type搜索模式
GET /_search //所有索引硬贯,所有type下的所有數(shù)據(jù)都搜索出來
GET /index1/_search //指定一個index,搜索其下所有type的數(shù)據(jù)
GET /index1,index2/_search //同時搜索兩個index下的數(shù)據(jù)
GET /*1,*2/_search //按照通配符去匹配多個索引
GET /inde1/type1/_search //搜索一個index下指定的type的數(shù)據(jù)
GET /index1/type1,type2/_search //可以搜索一個index下多個type的數(shù)據(jù)
GET /index1,index2/type1,type2/_search //搜索多個index下的多個type的數(shù)據(jù)
GET /_all/type1,type2/_search //可以代表搜索所有index下的指定type的數(shù)據(jù)
分頁
分頁語法:
GET /_search?size=pageSize&from=start //pageSize頁大小陨收,start從那條數(shù)據(jù)開始
示例:
假設(shè)有9條數(shù)據(jù)
//第一頁
GET /test_index/test_type/_search?size=3&from=0
//第二頁
GET /test_index/test_type/_search?size=3&from=3
//第三頁
GET /test_index/test_type/_search?size=3&from=6
深度分頁問題
比如有60000條數(shù)據(jù)饭豹,每個shard有20000條數(shù)據(jù)。每頁10條數(shù)據(jù)务漩,假設(shè)要搜索第1000頁拄衰?
分析:
請求可能發(fā)送到一個不包含這個index的shard所在的node上,這個node就是coordinate node饵骨,那么這個coordinate node就會將搜索請求轉(zhuǎn)發(fā)到index的三個node上去翘悉。
實際上,每個shard都要將內(nèi)部的20000條數(shù)據(jù)中的第1000頁數(shù)據(jù)居触,拿出來镐确。3個shard每個shard都要返回100010條數(shù)據(jù)給coordinate node包吝,coordinate node會收到共30030條數(shù)據(jù),然后再將這些數(shù)據(jù)排序源葫,_score相關(guān)分?jǐn)?shù)排序,然后取排位最高的前10條數(shù)據(jù)砖瞧,其實就是我們要的最后1000頁的10條數(shù)據(jù)
query string
語法及含義
GET /index/type/_search?q=test_field:test //test_field字段息堂,包含test
GET /index/type/_search?q=+test_field:test //和上面的一樣
GET /index/type/_search?q=-test_field:test//test_field字段,不包含test
GET /index/type/_search?q=test //任意一個字段块促,包含test
_all metadata的原理和作用
GET /index/type/_search?q=test
//或者
GET /index/type/_search
{
"query": {
"match": {
"_all": "test"
}
}
}
直接可以搜索所有的field荣堰,任意一個field包含指定的關(guān)鍵字就可以搜索出來。
es中的_all元數(shù)據(jù)竭翠,在建立索引的時候振坚,我們插入一條document,它里面包含了多個field斋扰,此時渡八,es會自動將多個field的值,全部用字符串的方式串聯(lián)起來传货,變成一個長的字符串屎鳍,作為_all field的值,同時建立索引
后面如果在搜索的時候问裕,沒有對某個field指定搜索逮壁,就默認(rèn)搜索_all field,其中是包含了所有field的值的
舉個例子
{
"name": "jack",
"age": 26,
"email": "jack@sina.com",
"address": "guamgzhou"
}
"jack 26 jack@sina.com guangzhou"粮宛,作為這一條document的_all field的值窥淆,同時進(jìn)行分詞后建立對應(yīng)的倒排索引