【问题标题】:Elasticsearch index aliases (w/ routing) and parent/child docsElasticsearch 索引别名(带路由)和父/子文档
【发布时间】:2013-05-20 20:22:55
【问题描述】:

我正在尝试建立具有以下特征的索引:

  • 该索引包含许多项目的数据。大多数工作都是特定于项目的,所以我为每个项目设置了别名,使用 project_id 作为路由字段。 (并作为关联的术语过滤器。)
  • 相关数据具有父/子结构。为简单起见,我们将文档类型称为“mama”和“baby”。

所以我们创建索引和别名:

curl -XDELETE http://localhost:9200/famtest
curl -XPOST http://localhost:9200/famtest -d '
{ "mappings" :
  { "mama" :
    { "properties" :
      { "project_id" : { "type" : "string", "index" : "not_analyzed" } }
    },
  "baby" :
    { "_parent" :
      { "type" : "mama" },
      "properties" :
      { "project_id" : { "type" : "string", "index" : "not_analyzed" } }
    }
  }
}'

curl -XPOST "http://localhost:9200/_aliases" -d '
{ "actions":
  [ { "add":
    { "alias": "family1",
      "index": "famtest",
      "routing": "100",
      "filter":
        { "term": { "project_id": "100" } }
     }
  } ]
}'

curl -XPOST "http://localhost:9200/_aliases" -d '
{ "actions":
  [ { "add":
    { "alias": "family2",
      "index": "famtest",
      "routing": "200",
      "filter":
        { "term": { "project_id": "200" } }
     }
  } ]
}'

现在让我们做一些妈妈:

curl -XPOST localhost:9200/family1/mama/1 -d '{ "name" : "Family 1 Mom", "project_id" : "100" }'
curl -XPOST localhost:9200/family2/mama/2 -d '{ "name" : "Family 2 Mom", "project_id" : "200" }'

这些文档现在可通过 /familyX/_search 获得。所以现在我们要添加一个婴儿:

curl -XPOST localhost:9200/family1/baby/1?parent=1 -d '{ "name": "Fam 1 Baby","project_id" : "100" }'

很遗憾,ES 不喜欢这样:

{"error":"ElasticSearchIllegalArgumentException[Alias [family1] has index routing associated with it [100], and was provided with routing value [1], rejecting operation]","status":400}

所以...知道如何使用别名路由并仍然设置父 ID?如果我理解正确,那应该不是问题:所有项目操作(在这种情况下为“family1”)都通过别名,因此父文档和子文档无论如何都会在同一个分片上结束。是否有其他方法可以设置父 ID,而不会干扰路由?

谢谢。如果我可以更具体一些,请告诉我。

【问题讨论】:

    标签: elasticsearch parent-child alias


    【解决方案1】:

    有趣的问题!正如您已经知道的,父 id 也用于路由,因为子必须在与父文档相同的分片中进行索引。您正在尝试做的事情很好,因为父母和孩子将属于同一个家庭,因此无论如何都在同一个分片中,因为您在家庭别名中配置了路由。

    但我担心父 id 的优先级高于别名中定义的路由,它会被覆盖,但这是不可能的,这就是你得到错误的原因。事实上,如果您再次尝试在索引请求中提供路由,它会起作用:

    curl -XPOST 'localhost:9200/family1/baby/1?parent=1&routing=100' -d '{ "name": "Fam 1 Baby","project_id" : "100" }'
    

    我会用curl recreation 填写github issue

    【讨论】:

    • 谢谢。将解决方案标记为已接受,并普遍确认这里发生了一些古怪的事情。我会在 GitHub 上跟进。
    • 对于后续问题,提交的问题是#3068
    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2021-03-23
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多