_routing field
ドキュメントは、次の式を使用してインデックス内の特定のシャードにルーティングされます:
routing_factor = num_routing_shards / num_primary_shards
shard_num = (hash(_routing) % num_routing_shards) / routing_factor
num_routing_shards
は、index.number_of_routing_shards
インデックス設定の値です。 num_primary_shards
は、index.number_of_shards
インデックス設定の値です。
デフォルトの_routing
値は、ドキュメントの_id
です。カスタムルーティングパターンは、ドキュメントごとにカスタムrouting
値を指定することで実装できます。例えば:
Python
resp = client.index(
index="my-index-000001",
id="1",
routing="user1",
refresh=True,
document={
"title": "This is a document"
},
)
print(resp)
resp1 = client.get(
index="my-index-000001",
id="1",
routing="user1",
)
print(resp1)
Ruby
response = client.index(
index: 'my-index-000001',
id: 1,
routing: 'user1',
refresh: true,
body: {
title: 'This is a document'
}
)
puts response
response = client.get(
index: 'my-index-000001',
id: 1,
routing: 'user1'
)
puts response
Js
const response = await client.index({
index: "my-index-000001",
id: 1,
routing: "user1",
refresh: "true",
document: {
title: "This is a document",
},
});
console.log(response);
const response1 = await client.get({
index: "my-index-000001",
id: 1,
routing: "user1",
});
console.log(response1);
Console
PUT my-index-000001/_doc/1?routing=user1&refresh=true
{
"title": "This is a document"
}
GET my-index-000001/_doc/1?routing=user1
このドキュメントは、IDの代わりにuser1 をルーティング値として使用します。 |
|
同じrouting 値は、取得、削除、または更新 ドキュメントを行う際に提供する必要があります。 |
#### Python
``````python
resp = client.search(
index="my-index-000001",
query={
"terms": {
"_routing": [
"user1"
]
}
},
)
print(resp)
`
Ruby
response = client.search(
index: 'my-index-000001',
body: {
query: {
terms: {
_routing: [
'user1'
]
}
}
}
)
puts response
Js
const response = await client.search({
index: "my-index-000001",
query: {
terms: {
_routing: ["user1"],
},
},
});
console.log(response);
Console
GET my-index-000001/_search
{
"query": {
"terms": {
"_routing": [ "user1" ]
}
}
}
_routing フィールドでのクエリ([ids クエリ](/read/elasticsearch-8-15/4a38cf71b645eb4e.md “IDs”)も参照) |
データストリームは、テンプレートでallow_custom_routing
設定が有効になっていない限り、カスタムルーティングをサポートしていません。
Searching with custom routing
カスタムルーティングを使用すると、検索の影響を軽減できます。インデックス内のすべてのシャードに検索リクエストをファンアウトする代わりに、特定のルーティング値(または値)に一致するシャードにリクエストを送信できます:
Python
resp = client.search(
index="my-index-000001",
routing="user1,user2",
query={
"match": {
"title": "document"
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my-index-000001',
routing: 'user1,user2',
body: {
query: {
match: {
title: 'document'
}
}
}
)
puts response
Js
const response = await client.search({
index: "my-index-000001",
routing: "user1,user2",
query: {
match: {
title: "document",
},
},
});
console.log(response);
Console
GET my-index-000001/_search?routing=user1,user2
{
"query": {
"match": {
"title": "document"
}
}
}
この検索リクエストは、user1 およびuser2 ルーティング値に関連付けられたシャードでのみ実行されます。 |
Making a routing value required
カスタムルーティングを使用する際は、インデックス、取得、削除、または更新する際にルーティング値を提供することが重要です。
ルーティング値を忘れると、ドキュメントが複数のシャードにインデックスされる可能性があります。安全策として、_routing
フィールドを設定して、すべてのCRUD操作にカスタムrouting
値を必須にすることができます:
Python
resp = client.indices.create(
index="my-index-000002",
mappings={
"_routing": {
"required": True
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000002",
id="1",
document={
"text": "No routing value provided"
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'my-index-000002',
body: {
mappings: {
_routing: {
required: true
}
}
}
)
puts response
response = client.index(
index: 'my-index-000002',
id: 1,
body: {
text: 'No routing value provided'
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000002",
mappings: {
_routing: {
required: true,
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000002",
id: 1,
document: {
text: "No routing value provided",
},
});
console.log(response1);
Console
PUT my-index-000002
{
"mappings": {
"_routing": {
"required": true
}
}
}
PUT my-index-000002/_doc/1
{
"text": "No routing value provided"
}
すべてのドキュメントに対してルーティングが必要です。 | |
このインデックスリクエストはrouting_missing_exception をスローします。 |
Unique IDs with custom routing
カスタム_routing
を指定してドキュメントをインデックスする場合、_id
の一意性はインデックス内のすべてのシャードで保証されません。実際、同じ_id
を持つドキュメントは、異なる_routing
値でインデックスされると異なるシャードに配置される可能性があります。
IDがインデックス全体で一意であることを保証するのはユーザーの責任です。
Routing to an index partition
インデックスは、カスタムルーティング値が単一のシャードではなく、シャードのサブセットに送信されるように構成できます。これにより、検索の影響を軽減しながら、バランスの取れたクラスターになるリスクを軽減できます。
これは、インデックス作成時にインデックスレベル設定index.routing_partition_size
を提供することで行われます。パーティションサイズが増加するにつれて、データはより均等に分散されますが、リクエストごとに検索するシャードが増えることになります。
この設定が存在する場合、シャードを計算するための式は次のようになります:
routing_value = hash(_routing) + hash(_id) % routing_partition_size
shard_num = (routing_value % num_routing_shards) / routing_factor
つまり、_routing
フィールドはインデックス内のシャードのセットを計算するために使用され、その後_id
がそのセット内のシャードを選択するために使用されます。
この機能を有効にするには、index.routing_partition_size
は1より大きく、index.number_of_shards
未満の値を持っている必要があります。
有効にすると、パーティション化されたインデックスには次の制限があります:
join
フィールドの関係を持つマッピングは作成できません。- インデックス内のすべてのマッピングは、
_routing
フィールドが必須としてマークされている必要があります。