1. 空搜索
最基础的搜索API,没有任何参数,返回集群 索引 空格中所有的文档
GET /_search
响应数据
{
"hits" : {
"total" : 14, //检索到的总文档数
"hits" : [ //前十个文档
{ //第一个文档
"_index": "us",
"_type": "tweet",
"_id": "7",
"_score": 1, //相关性得分,默认最大的排在最前面
"_source": {
"date": "2014-09-17",
"name": "John Smith",
"tweet": "The Query DSL is really powerful and flexible",
"user_id": 2
}
},
... 9 RESULTS REMOVED ...
],
"max_score" : 1 //所有文档中相关性得分的最大值
},
"took" : 4, //搜索花费的毫秒数
"_shards" : { //描述分片的信息
"failed" : 0,
"successful" : 10,
"total" : 10
},
"timed_out" : false //是否超时
}
timeout参数的意义
设置:
GET /_search?timeout=10ms
意义:
将返回超时时间之前搜索到的数据,但是集群里还是会完成整个检索过程,即使响应已经返回
2. 多索引多类型的搜索
/_search
搜索整个集群
/gb/_search
在gb索引中搜索
/gb,us/_search
你猜
/g*,u*/_search
在g u开头的索引中搜索
/gb/user/_search
在gb索引中user类型下搜索
/gb,us/tweet,user/_search
你猜
/_all/user,tweet/_search
在所有索引中的user,tweet类型下搜索
3. 分页
几个参数:
size:每页文档个数 默认值10
from:偏移量
每页十个数据,查看前三页
GET /_search
GET /_search?size=10?from=10
GET/_search?size=10?from=20
注意:应该避免一次性分页太深或者所有太多的数据
**原因:**_search命令返回的数据都是经过排序的,排序的过程和外排序很像
比如说检索第一页数据,那么所有涉及到的分片都会把自己分片上符合条件的前十个文档进行排序,然后返回给请求结点,请求结点再将所有分片返回来的十个文档进行排序,得到前十个。
但是现在检索第1000页数据,那么所有的分片就必须检索出自己分片上排名前1000*10个数据,然后返回给请求结点。请求结点拿着n*1000*10个文档,排序出第10000到第10010个文档,剩余的文档就会进行舍弃!!!
可以分析出,在分布式的系统中,排序结果的花费随着分页的增长成倍的增长,所以一般在分布式的系统中,应该避免大量对结果排序的请求。但是也可以通过特定的技术,实现高效的检索大量数据。
4. 简易搜索
GET /_all/tweet/_search?q=tweet:elasticsearch