_routing field

ドキュメントは、次の式を使用してインデックス内の特定のシャードにルーティングされます:

  1. routing_factor = num_routing_shards / num_primary_shards
  2. 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

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. routing="user1",
  5. refresh=True,
  6. document={
  7. "title": "This is a document"
  8. },
  9. )
  10. print(resp)
  11. resp1 = client.get(
  12. index="my-index-000001",
  13. id="1",
  14. routing="user1",
  15. )
  16. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. routing: 'user1',
  5. refresh: true,
  6. body: {
  7. title: 'This is a document'
  8. }
  9. )
  10. puts response
  11. response = client.get(
  12. index: 'my-index-000001',
  13. id: 1,
  14. routing: 'user1'
  15. )
  16. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. routing: "user1",
  5. refresh: "true",
  6. document: {
  7. title: "This is a document",
  8. },
  9. });
  10. console.log(response);
  11. const response1 = await client.get({
  12. index: "my-index-000001",
  13. id: 1,
  14. routing: "user1",
  15. });
  16. console.log(response1);

Console

  1. PUT my-index-000001/_doc/1?routing=user1&refresh=true
  2. {
  3. "title": "This is a document"
  4. }
  5. GET my-index-000001/_doc/1?routing=user1
このドキュメントは、IDの代わりにuser1をルーティング値として使用します。
同じrouting値は、

取得削除、または更新

ドキュメントを行う際に提供する必要があります。
  1. #### Python
  2. ``````python
  3. resp = client.search(
  4. index="my-index-000001",
  5. query={
  6. "terms": {
  7. "_routing": [
  8. "user1"
  9. ]
  10. }
  11. },
  12. )
  13. print(resp)
  14. `

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. terms: {
  6. _routing: [
  7. 'user1'
  8. ]
  9. }
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. terms: {
  5. _routing: ["user1"],
  6. },
  7. },
  8. });
  9. console.log(response);

Console

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "terms": {
  5. "_routing": [ "user1" ]
  6. }
  7. }
  8. }
_routingフィールドでのクエリ([idsクエリ](/read/elasticsearch-8-15/4a38cf71b645eb4e.md “IDs”)も参照)

データストリームは、テンプレートでallow_custom_routing設定が有効になっていない限り、カスタムルーティングをサポートしていません。

Searching with custom routing

カスタムルーティングを使用すると、検索の影響を軽減できます。インデックス内のすべてのシャードに検索リクエストをファンアウトする代わりに、特定のルーティング値(または値)に一致するシャードにリクエストを送信できます:

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. routing="user1,user2",
  4. query={
  5. "match": {
  6. "title": "document"
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. routing: 'user1,user2',
  4. body: {
  5. query: {
  6. match: {
  7. title: 'document'
  8. }
  9. }
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. routing: "user1,user2",
  4. query: {
  5. match: {
  6. title: "document",
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. GET my-index-000001/_search?routing=user1,user2
  2. {
  3. "query": {
  4. "match": {
  5. "title": "document"
  6. }
  7. }
  8. }
この検索リクエストは、user1およびuser2ルーティング値に関連付けられたシャードでのみ実行されます。

Making a routing value required

カスタムルーティングを使用する際は、インデックス取得削除、または更新する際にルーティング値を提供することが重要です。

ルーティング値を忘れると、ドキュメントが複数のシャードにインデックスされる可能性があります。安全策として、_routingフィールドを設定して、すべてのCRUD操作にカスタムrouting値を必須にすることができます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000002",
  3. mappings={
  4. "_routing": {
  5. "required": True
  6. }
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.index(
  11. index="my-index-000002",
  12. id="1",
  13. document={
  14. "text": "No routing value provided"
  15. },
  16. )
  17. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000002',
  3. body: {
  4. mappings: {
  5. _routing: {
  6. required: true
  7. }
  8. }
  9. }
  10. )
  11. puts response
  12. response = client.index(
  13. index: 'my-index-000002',
  14. id: 1,
  15. body: {
  16. text: 'No routing value provided'
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000002",
  3. mappings: {
  4. _routing: {
  5. required: true,
  6. },
  7. },
  8. });
  9. console.log(response);
  10. const response1 = await client.index({
  11. index: "my-index-000002",
  12. id: 1,
  13. document: {
  14. text: "No routing value provided",
  15. },
  16. });
  17. console.log(response1);

Console

  1. PUT my-index-000002
  2. {
  3. "mappings": {
  4. "_routing": {
  5. "required": true
  6. }
  7. }
  8. }
  9. PUT my-index-000002/_doc/1
  10. {
  11. "text": "No routing value provided"
  12. }
すべてのドキュメントに対してルーティングが必要です。
このインデックスリクエストはrouting_missing_exceptionをスローします。

Unique IDs with custom routing

カスタム_routingを指定してドキュメントをインデックスする場合、_idの一意性はインデックス内のすべてのシャードで保証されません。実際、同じ_idを持つドキュメントは、異なる_routing値でインデックスされると異なるシャードに配置される可能性があります。

IDがインデックス全体で一意であることを保証するのはユーザーの責任です。

Routing to an index partition

インデックスは、カスタムルーティング値が単一のシャードではなく、シャードのサブセットに送信されるように構成できます。これにより、検索の影響を軽減しながら、バランスの取れたクラスターになるリスクを軽減できます。

これは、インデックス作成時にインデックスレベル設定index.routing_partition_sizeを提供することで行われます。パーティションサイズが増加するにつれて、データはより均等に分散されますが、リクエストごとに検索するシャードが増えることになります。

この設定が存在する場合、シャードを計算するための式は次のようになります:

  1. routing_value = hash(_routing) + hash(_id) % routing_partition_size
  2. shard_num = (routing_value % num_routing_shards) / routing_factor

つまり、_routingフィールドはインデックス内のシャードのセットを計算するために使用され、その後_idがそのセット内のシャードを選択するために使用されます。

この機能を有効にするには、index.routing_partition_sizeは1より大きく、index.number_of_shards未満の値を持っている必要があります。

有効にすると、パーティション化されたインデックスには次の制限があります:

  • joinフィールドの関係を持つマッピングは作成できません。
  • インデックス内のすべてのマッピングは、_routingフィールドが必須としてマークされている必要があります。