Elasticsearch之路由(routing)

路由

  主要解决的是文档应该存储在哪个分片中

  实际过程是根据公式计算出进行分配  

1 # 路由哈希值 % 主分片的数量
2 shard = hash(routing) % number_of_primary_shards
3 # 路由默认值是文档的_id

自定义路由

1 PUT r1/doc/1?routing=user1
2 {
3   "title":"论母猪的产前保养"
4 }
5 PUT r1/doc/2?routing=user1
6 {
7   "title":"论母猪的产后护理"
8 }

这两篇文档都分配在一个分片上了

通过路由查询文档

GET r1/doc/1?routing=user1
# 结果如下
{
  "_index" : "r1",
  "_type" : "doc",
  "_id" : "1",
  "_version" : 3,
  "_routing" : "user1",
  "found" : true,
  "_source" : {
    "title" : "论母猪的产前保养"
  }
}

通过路由值查找

 1 GET r1/doc/_search
 2 {
 3   "query": {
 4     "terms": {
 5       "_routing":["user1"] 
 6     }
 7   }
 8 }
 9 # 结果如下
10 {
11   "took" : 0,
12   "timed_out" : false,
13   "_shards" : {
14     "total" : 5,
15     "successful" : 5,
16     "skipped" : 0,
17     "failed" : 0
18   },
19   "hits" : {
20     "total" : 2,
21     "max_score" : 1.0,
22     "hits" : [
23       {
24         "_index" : "r1",
25         "_type" : "doc",
26         "_id" : "2",
27         "_score" : 1.0,
28         "_routing" : "user1",
29         "_source" : {
30           "title" : "论母猪的产后护理"
31         }
32       },
33       {
34         "_index" : "r1",
35         "_type" : "doc",
36         "_id" : "1",
37         "_score" : 1.0,
38         "_routing" : "user1",
39         "_source" : {
40           "title" : "论母猪的产前保养"
41         }
42       }
43     ]
44   }
45 }

删除文档 就要带上路由值不然会找不到

DELETE r1/doc/1   
# 结果如下
{
  "_index" : "r1",
  "_type" : "doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "not_found",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}


DELETE r1/doc/1?routing=user1
# 结果如下
{
  "_index" : "r1",
  "_type" : "doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 4,
  "_primary_term" : 1
}

查询多个路由

PUT r2/doc/1?routing=user1
{
  "title":"母猪产前保养重点在多喂饲料,辅以人工按摩"
}

PUT r2/doc/2?routing=user2
{
  "title":"母猪产后护理重点在母子隔离喂养"
}

查找

GET r2/doc/_search?routing=user1,user2
{
  "query": {
    "match": {
      "title": "母猪"
    }
  }
}
# 结果如下
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.68324494,
    "hits" : [
      {
        "_index" : "r2",
        "_type" : "doc",
        "_id" : "2",
        "_score" : 0.68324494,
        "_routing" : "user2",
        "_source" : {
          "title" : "母猪产后护理重点在母子隔离喂养"
        }
      },
      {
        "_index" : "r2",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 0.5753642,
        "_routing" : "user1",
        "_source" : {
          "title" : "母猪产前保养重点在多喂饲料,辅以人工按摩"
        }
      }
    ]
  }
}

处理忘记路由(导致文档在多个分片建立索引)

PUT r3/doc/1?routing=u1
{
  "title":"小猪仔非常可爱"
}

PUT r3/doc/2
{
  "title":"再可爱也是一盘菜"
}

查询

GET r3/doc/_search
{
  "query": {
    "terms": {
      "_routing":["u1"]
    }
  }
}
# 结果如下
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "r3",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 1.0,
        "_routing" : "u1",
        "_source" : {
          "title" : "小猪仔非常可爱"
        }
      }
    ]
  }
}

文档2可以根据普通查询,这样两篇文档都要被返回,避免这样子的情况

# 以下是6.5.4版本的写法
PUT r4
{
  "mappings": {
    "doc":{
      "_routing":{
        "required": true
      }
    }
  }
}
# 以下是7.0后的官方文档的的写法
PUT my_index2 
{ 
  "mappings":{ 
    "_ usting":{ 
      "required":true
    } 
  } 
} 

在进行对文档操作的时候就必须带上路由参数

PUT r4/doc/1?routing参数
{
  "title":"母猪不怀孕怎么办?"
}

  

猜你喜欢

转载自www.cnblogs.com/Alexephor/p/11413607.html