Elasticsearch之路由(routing)

匿名 (未验证) 提交于 2019-12-02 23:55:01

路由

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

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

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":"母猪不怀孕怎么办?" }

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!