配列

Elasticsearch には専用の array データ型はありません。デフォルトでは、任意のフィールドにゼロ以上の値を含めることができますが、配列内のすべての値は同じデータ型でなければなりません。例えば:

  • 文字列の配列: [ "one", "two" ]
  • 整数の配列: [ 1, 2 ]
  • 配列の配列: [ 1, [ 2, 3 ]] これは [ 1, 2, 3 ] と同等です。
  • オブジェクトの配列: [ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 } ]

オブジェクトの配列

オブジェクトの配列は期待通りには機能しません:配列内の他のオブジェクトとは独立して各オブジェクトをクエリすることはできません。これを可能にする必要がある場合は、nested データ型を使用するべきです。object データ型の代わりに。

これは Nested でより詳細に説明されています。

フィールドを動的に追加する際、配列内の最初の値がフィールド type を決定します。すべての後続の値は同じデータ型でなければならず、少なくとも後続の値を同じデータ型にcoerce することが可能でなければなりません。

データ型の混合を含む配列は サポートされていません: [ 10, "some string" ]

配列には null 値を含めることができ、これは構成された null_value に置き換えられるか、完全にスキップされます。空の配列 [] は欠落フィールドとして扱われます—値のないフィールドです。

ドキュメントで配列を使用するために事前に構成する必要はなく、すぐにサポートされています:

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. document={
  5. "message": "some arrays in this document...",
  6. "tags": [
  7. "elasticsearch",
  8. "wow"
  9. ],
  10. "lists": [
  11. {
  12. "name": "prog_list",
  13. "description": "programming list"
  14. },
  15. {
  16. "name": "cool_list",
  17. "description": "cool stuff list"
  18. }
  19. ]
  20. },
  21. )
  22. print(resp)
  23. resp1 = client.index(
  24. index="my-index-000001",
  25. id="2",
  26. document={
  27. "message": "no arrays in this document...",
  28. "tags": "elasticsearch",
  29. "lists": {
  30. "name": "prog_list",
  31. "description": "programming list"
  32. }
  33. },
  34. )
  35. print(resp1)
  36. resp2 = client.search(
  37. index="my-index-000001",
  38. query={
  39. "match": {
  40. "tags": "elasticsearch"
  41. }
  42. },
  43. )
  44. print(resp2)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. body: {
  5. message: 'some arrays in this document...',
  6. tags: [
  7. 'elasticsearch',
  8. 'wow'
  9. ],
  10. lists: [
  11. {
  12. name: 'prog_list',
  13. description: 'programming list'
  14. },
  15. {
  16. name: 'cool_list',
  17. description: 'cool stuff list'
  18. }
  19. ]
  20. }
  21. )
  22. puts response
  23. response = client.index(
  24. index: 'my-index-000001',
  25. id: 2,
  26. body: {
  27. message: 'no arrays in this document...',
  28. tags: 'elasticsearch',
  29. lists: {
  30. name: 'prog_list',
  31. description: 'programming list'
  32. }
  33. }
  34. )
  35. puts response
  36. response = client.search(
  37. index: 'my-index-000001',
  38. body: {
  39. query: {
  40. match: {
  41. tags: 'elasticsearch'
  42. }
  43. }
  44. }
  45. )
  46. puts response

Go

  1. {
  2. res, err := es.Index(
  3. "my-index-000001",
  4. strings.NewReader(`{
  5. "message": "some arrays in this document...",
  6. "tags": [
  7. "elasticsearch",
  8. "wow"
  9. ],
  10. "lists": [
  11. {
  12. "name": "prog_list",
  13. "description": "programming list"
  14. },
  15. {
  16. "name": "cool_list",
  17. "description": "cool stuff list"
  18. }
  19. ]
  20. }`),
  21. es.Index.WithDocumentID("1"),
  22. es.Index.WithPretty(),
  23. )
  24. fmt.Println(res, err)
  25. }
  26. {
  27. res, err := es.Index(
  28. "my-index-000001",
  29. strings.NewReader(`{
  30. "message": "no arrays in this document...",
  31. "tags": "elasticsearch",
  32. "lists": {
  33. "name": "prog_list",
  34. "description": "programming list"
  35. }
  36. }`),
  37. es.Index.WithDocumentID("2"),
  38. es.Index.WithPretty(),
  39. )
  40. fmt.Println(res, err)
  41. }
  42. {
  43. res, err := es.Search(
  44. es.Search.WithIndex("my-index-000001"),
  45. es.Search.WithBody(strings.NewReader(`{
  46. "query": {
  47. "match": {
  48. "tags": "elasticsearch"
  49. }
  50. }
  51. }`)),
  52. es.Search.WithPretty(),
  53. )
  54. fmt.Println(res, err)
  55. }

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. document: {
  5. message: "some arrays in this document...",
  6. tags: ["elasticsearch", "wow"],
  7. lists: [
  8. {
  9. name: "prog_list",
  10. description: "programming list",
  11. },
  12. {
  13. name: "cool_list",
  14. description: "cool stuff list",
  15. },
  16. ],
  17. },
  18. });
  19. console.log(response);
  20. const response1 = await client.index({
  21. index: "my-index-000001",
  22. id: 2,
  23. document: {
  24. message: "no arrays in this document...",
  25. tags: "elasticsearch",
  26. lists: {
  27. name: "prog_list",
  28. description: "programming list",
  29. },
  30. },
  31. });
  32. console.log(response1);
  33. const response2 = await client.search({
  34. index: "my-index-000001",
  35. query: {
  36. match: {
  37. tags: "elasticsearch",
  38. },
  39. },
  40. });
  41. console.log(response2);

コンソール

  1. PUT my-index-000001/_doc/1
  2. {
  3. "message": "some arrays in this document...",
  4. "tags": [ "elasticsearch", "wow" ],
  5. "lists": [
  6. {
  7. "name": "prog_list",
  8. "description": "programming list"
  9. },
  10. {
  11. "name": "cool_list",
  12. "description": "cool stuff list"
  13. }
  14. ]
  15. }
  16. PUT my-index-000001/_doc/2
  17. {
  18. "message": "no arrays in this document...",
  19. "tags": "elasticsearch",
  20. "lists": {
  21. "name": "prog_list",
  22. "description": "programming list"
  23. }
  24. }
  25. GET my-index-000001/_search
  26. {
  27. "query": {
  28. "match": {
  29. "tags": "elasticsearch"
  30. }
  31. }
  32. }
tags フィールドは string フィールドとして動的に追加されます。
lists フィールドは object フィールドとして動的に追加されます。
2番目のドキュメントには配列が含まれていませんが、同じフィールドにインデックスを付けることができます。
クエリは elasticsearchtags フィールドで探し、両方のドキュメントに一致します。