主要内容:_search结果分析,multi-index搜索模式,分页搜索,query string基础语法
1、_search结果分析
返回示例:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "7",
"_score" : 1.0,
"_source" : {
json
}
}
]
}
}
-
took
– Elasticsearch运行查询多长时间(以毫秒为单位) -
timed_out
–搜索请求是否超时,默认无timeout,latency平衡completeness,手动指定timeout -
_shards
–搜索了多少个分片以及成功,失败或跳过了多少个分片。 -
max_score
–找到的最相关文件的分数 -
hits.total.value
-找到了多少个匹配的文档 -
hits.sort
-文档的排序位置(不按相关性得分排序时) -
hits._score
-文档的相关性得分(使用时不适用match_all
) - hits.hits:默认查询前10条数据,完整数据,score降序排序
手动指定过期时间:
可选的参数值为 timeout=10ms,timeout=1s,timeout=1m
GET ecommerce/_search?timeout=1ms
2、multi-index搜索模式
一次性搜索多个index下的数据
/_search:所有索引下的所有数据都搜索出来
/index1/search:指定一个index,搜索其下所有document数据
/index1,index2/search:同时搜索两个index下的数据
/*1,*2/search:按照通配符去匹配多个索引
搜索示例:
GET /_search
GET /ecommerce,test_index/_search
GET /test_index/_search
GET /test_*/_search
3、分页搜索
使用size,from 参数进行分页搜索
GET /_search?size=10
GET /_search?size=10&from=0
GET /_search?size=10&from=20
示例
从第2条开始取,取5条,按照id升序排列
GET ecommerce/_search?size=5&from=1
{
"query": {
"match_all": {}
},
"sort": [
{
"id": {
"order": "asc"
}
}
]
}
4、deep paging性能问题
什么叫deep paging ?简单来说,就是搜索的特别深,比如总共有60000条数据,每个shard上分了20000条数据。每页是10条数据,这个时候,你要搜索到第1000页,实际上要拿到的是10001~10010
这种情况下要搜索60000条数据中的第1000页,实际上每个shard都要将内部的20000条数据中的第1~10010条数据拿出来,是10010条数据。3个shard每个shard都返回10010条数据给coordinate node , coordinate node会收到总共30030条数据,然后在这些数据中进行排序,score ,相关度分数,然后取到排位最高的10001~10010条数据,其实就是我们要的最后的第1000页的10条数据。
搜索的过深的时候,就需要在coordinate node上保存大量的数据,还要进行大量数据的排序,排序之后,再取出对应的那一页。所以这个过程,即耗费网络带宽,耗费内存,还耗费cpu。我们应该尽量避免出现这种deep paging操作。
5、query string基础语法
查询示例01: 检索desc含有“special”关键字的document
GET /ecommerce/_search?q=desc:special
返回的结果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.7917595,
"hits" : [
{
"_index" : "ecommerce",
"_type" : "_doc",
"_id" : "sBkH-3ABDLwU_RgbxhX0",
"_score" : 1.7917595,
"_source" : {
"name" : "special yagao",
"desc" : "special meibai",
"price" : 50,
"producer" : "special yagao producer",
"tags" : [
"meibai"
]
}
}
]
}
}
“+”号表示必须要包含“special”关键字
GET /ecommerce/_search?q=+desc:special
“-”号表示不包含“special”关键字
GET /ecommerce/_search?q=-name:yagao
6、_all metadata的原理和作用
示例代码:
GET /ecommerce/_search?q=test1
直接可以搜索所有的field,任意一个field包含指定的关键字就可以搜索出来。我们在进行中搜索的时候,难道是对document中的每一个field都进行一次搜索吗?不是的
es中的_all元数据,在建立索引的时候,我们插入一条document,它里面包含了多个field,此时,es会自动将多个field的值,全部用字符串的方式串联起来,变成一个长的字符串,作为_all field的值,同时建立索引,后面如果在搜索的时候,没有对某个field指定搜索,就默认搜索_all field,其中是包含了所有field的值的
举个例子
{
"name": "jack",
"age": 26,
"email": "jack@sina.com",
"address": "guangzhou"
}
"jack 26 jack@sina.com guangzhou",作为这一条document的_all field的值,同时进行分词后建立对应的倒排索引.