_search
GET /_search
搜索所有的doucment并默认返回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:整个搜索请求花费了多少毫秒
- hits.max_score:本次搜索的所有结果中,最大的相关度分数是多少,每一条document对于search的相关度,越相关,_score分数越大,排位越靠前
- hits.hits:默认返回10条完整的数据,_score降序排列
- shards:shards fail的条件(primary和replica全部挂掉),不影响其他shard。默认情况下来说,一个搜索请求,会打到一个index的所有primary shard上去,当然了,每个primary shard都可能会有一个或多个replic shard,所以请求也可以到primary shard的其中一个replica shard上去。
- timeout:默认无timeout,可以手动指定timeout(timeout=10ms,timeout=1s,timeout=1m,GET /_search?timeout=10m)
- timeout机制:指定每个shard,就只能在timeout时间范围内,将搜索到的部分数据(也可能全部都搜索到了),直接立即返回给client程序,而不是等到所有的数据全部搜索出来以后再返回,确保说,一次搜索请求可以在用户指定的timeout时长内完成。为一些时间敏感的搜索应用提供良好的支持。
multi-index和multi-type搜索模式
GET /_search //所有索引,所有type下的所有数据都搜索出来
GET /index1/_search //指定一个index,搜索其下所有type的数据
GET /index1,index2/_search //同时搜索两个index下的数据
GET /*1,*2/_search //按照通配符去匹配多个索引
GET /inde1/type1/_search //搜索一个index下指定的type的数据
GET /index1/type1,type2/_search //可以搜索一个index下多个type的数据
GET /index1,index2/type1,type2/_search //搜索多个index下的多个type的数据
GET /_all/type1,type2/_search //可以代表搜索所有index下的指定type的数据
分页
分页语法:
GET /_search?size=pageSize&from=start //pageSize页大小,start从那条数据开始
示例:
假设有9条数据
//第一页
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条数据,每个shard有20000条数据。每页10条数据,假设要搜索第1000页?
分析:
请求可能发送到一个不包含这个index的shard所在的node上,这个node就是coordinate node,那么这个coordinate node就会将搜索请求转发到index的三个node上去。
实际上,每个shard都要将内部的20000条数据中的第1000页数据,拿出来。3个shard每个shard都要返回100010条数据给coordinate node,coordinate node会收到共30030条数据,然后再将这些数据排序,_score相关分数排序,然后取排位最高的前10条数据,其实就是我们要的最后1000页的10条数据
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包含指定的关键字就可以搜索出来。
es中的_all元数据,在建立索引的时候,我们插入一条document,它里面包含了多个field,此时,es会自动将多个field的值,全部用字符串的方式串联起来,变成一个长的字符串,作为_all field的值,同时建立索引
后面如果在搜索的时候,没有对某个field指定搜索,就默认搜索_all field,其中是包含了所有field的值的
举个例子
{
"name": "jack",
"age": 26,
"email": "jack@sina.com",
"address": "guamgzhou"
}
"jack 26 jack@sina.com guangzhou",作为这一条document的_all field的值,同时进行分词后建立对应的倒排索引