zoukankan      html  css  js  c++  java
  • 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":"母猪不怀孕怎么办?"
    }

      

  • 相关阅读:
    redis的间隔性速度慢的问题
    centos增加静态路由
    排查问题的一些基本命令
    laradock
    python之sqlalchemy基本
    ssl证书之certbot
    mysql 多实例
    模块和包
    异步
    WSGI
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11413607.html
Copyright © 2011-2022 走看看