Elasticsearch----_search搜索、multi-index和multi-type搜索模式、分页、query string

_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条数据

Elasticsearch----_search搜索、multi-index和multi-type搜索模式、分页、query string_第1张图片
deep page

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": "[email protected]",
  "address": "guamgzhou"
}

"jack 26 [email protected] guangzhou",作为这一条document的_all field的值,同时进行分词后建立对应的倒排索引

你可能感兴趣的:(Elasticsearch----_search搜索、multi-index和multi-type搜索模式、分页、query string)