路由
主要解决的是文档应该存储在哪个分片中
实际过程是根据公式计算出进行分配
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":"母猪不怀孕怎么办?" }