这篇介绍稍多,篇幅可能有点多,下面会针对一些重要的点做一些小测试
搜索返回文档解析
hits
搜索返回的结果中最重要的一部分其中包含了 索引信息(_index,_type,_index,_source,_score),_source又是其中我们最需要的东西,里面包含了查询的整个文档的内容,默认返回10个文档,这块可以结合分页处理
took
显示查询花费的时间
shards
查询的数据实际都检索了几个分区,这块跟关系型数据库中的表分区差不多,mysql 中的 partitions 通过执行计划查看可以看到
"_shards" : {
"failed" : 0,
"successful" : 10,
"total" : 10
}
看下上面的问题,这里可以会有失败的检索分片个数,在时间过程中如果数据分片丢失了,这里仍然会返回查询到的数据
timeout
查询是否超时
"timed_out" : false,我们也可以这样来写
GET _index/_type/?timeout=50 (ms)
给出我们的预期检索时间,当数据体量过大的时候或服务器性能本身的瓶颈,可能一次有效的搜索返回的结果很大(很多满足条件的搜索),这可能需要很长的时间,这是用户不能接受的,给出一个预期的需要查询的失效时间,满足这个时间就会停止查询,返回我们的结果,当然 可能搜索 10ms可能也会有很多数据,这块就需要分页显示了,给数据库分页一个概念
多索引多类型查询
满足如下规则即可
_index1,_index2/_type1,_type2/_search 用逗号分隔开
对应泛指情况可以使用*来处理,这点有点类似 Window系统中常用的搜索 如 *.jpg
a*,b*/_type1,_type2/_search
这里需要说明的是所有的 索引类型都是组合关系
分页查询
分页查询结合前面的查询通过 size 、from 来处理
GET _index/_type/_search?size=10&from=10
size:需要查询的数据条数 、from:从那一条开始 默认是0,这块与EF中的 Take(size).Skip(from) 类似,取多少条,跳过多少开始取
这里如果是单个分片查询还好,如果数据来之多个分片的情况下,排序就需要处理了,否则查询出来的数据可能不是最满足我们条件的数据。
如果我们能在查询来自3个分片,我们需要在我们实际查询的逻辑是先查询出来在组合起来排序取到size,这点类似 你高中时期的成绩
如:我们需要取出来 全年级排名前40-50的人员信息,首先我们不能取每个班级第40-50的人员 然后按班级组合在一起 在取第40-50,显然这样做是错误的,因为 班级1-50中的一些完全有可能在年纪40-50中,但是这里有一个临界点,就是班级中50以后的绝对不会在年级的前50,这是可以肯定的,为了查询到最后的结果,必须把每个班级都是取前5-条数据,然后合并后在取第40-50的数据才是正确的
注:这里我们实际要检索的数据 是 【分片数据*from】的数量,当我们的分页纵深很大的时候 取到第500页,每页10条,3个分片,最终检索出来的数据是 3*5000 条数据的排序 ,如果取到数据纵深越大,搜索效率也是越低的
轻量查询
轻量级查询不需要写表达式,一般通过get请求,通过参数的方式查询结果,带有query match 等表达式的查询不一样,它是通过地址栏组合参数来处理
结合前面数据例子:
http://192.168.0.212:9200/liyouming/_search?pretty&q=+mytext:黎又铭)
结果:
{ "took" : 7, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 3, "max_score" : 3.0561461, "hits" : [ { "_index" : "liyouming", "_type" : "liyoumingtext", "_id" : "c7eQAWoB0Mh7sqcTGY-K", "_score" : 3.0561461, "_source" : { "mytext" : "中午黎又铭在操场上打篮球" } }, { "_index" : "liyouming", "_type" : "liyoumingtext", "_id" : "dLeQAWoB0Mh7sqcTdo9b", "_score" : 2.1251993, "_source" : { "mytext" : "深夜还在写代码的人只有黎又铭" } }, { "_index" : "liyouming", "_type" : "liyoumingtext", "_id" : "crePAWoB0Mh7sqcTzY-2", "_score" : 0.8630463, "_source" : { "mytext" : "黎又铭早上吃了一碗面" } } ] } }