1

次の特性を持つインデックスを設定しようとしています。

  • インデックスには、多くのプロジェクトのデータが格納されています。ほとんどの作業はプロジェクト固有であるため、ルーティング フィールドとして project_id を使用して、プロジェクトごとにエイリアスを設定します。(および関連用語フィルターとして。)
  • 問題のデータには親子構造があります。簡単にするために、ドキュメント タイプを「ママ」と「赤ちゃん」と呼びましょう。

したがって、インデックスとエイリアスを作成します。

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 を設定する別の方法はありますか?

ありがとう。もっと具体的に教えてください。

4

1 に答える 1

1

興味深い質問です!ご存知のように、子は親ドキュメントと同じシャードでインデックスを作成する必要があるため、親 ID もルーティングに使用されます。ファミリ エイリアスでルーティングを設定したため、親と子は同じファミリに分類されるため、何をしようとしても問題ありません。

しかし、親 ID は上書きされるエイリアスで定義されたルーティングよりも優先度が高いのではないかと心配していますが、それは不可能であり、エラーが発生する理由です。実際、インデックス リクエストでルーティングを再度指定すると、次のように機能します。

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

私なら、 github の問題curl recreationで埋めます。

于 2013-05-20T20:46:59.747 に答える