配列
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
resp = client.index(
index="my-index-000001",
id="1",
document={
"message": "some arrays in this document...",
"tags": [
"elasticsearch",
"wow"
],
"lists": [
{
"name": "prog_list",
"description": "programming list"
},
{
"name": "cool_list",
"description": "cool stuff list"
}
]
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="2",
document={
"message": "no arrays in this document...",
"tags": "elasticsearch",
"lists": {
"name": "prog_list",
"description": "programming list"
}
},
)
print(resp1)
resp2 = client.search(
index="my-index-000001",
query={
"match": {
"tags": "elasticsearch"
}
},
)
print(resp2)
Ruby
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
message: 'some arrays in this document...',
tags: [
'elasticsearch',
'wow'
],
lists: [
{
name: 'prog_list',
description: 'programming list'
},
{
name: 'cool_list',
description: 'cool stuff list'
}
]
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 2,
body: {
message: 'no arrays in this document...',
tags: 'elasticsearch',
lists: {
name: 'prog_list',
description: 'programming list'
}
}
)
puts response
response = client.search(
index: 'my-index-000001',
body: {
query: {
match: {
tags: 'elasticsearch'
}
}
}
)
puts response
Go
{
res, err := es.Index(
"my-index-000001",
strings.NewReader(`{
"message": "some arrays in this document...",
"tags": [
"elasticsearch",
"wow"
],
"lists": [
{
"name": "prog_list",
"description": "programming list"
},
{
"name": "cool_list",
"description": "cool stuff list"
}
]
}`),
es.Index.WithDocumentID("1"),
es.Index.WithPretty(),
)
fmt.Println(res, err)
}
{
res, err := es.Index(
"my-index-000001",
strings.NewReader(`{
"message": "no arrays in this document...",
"tags": "elasticsearch",
"lists": {
"name": "prog_list",
"description": "programming list"
}
}`),
es.Index.WithDocumentID("2"),
es.Index.WithPretty(),
)
fmt.Println(res, err)
}
{
res, err := es.Search(
es.Search.WithIndex("my-index-000001"),
es.Search.WithBody(strings.NewReader(`{
"query": {
"match": {
"tags": "elasticsearch"
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
}
Js
const response = await client.index({
index: "my-index-000001",
id: 1,
document: {
message: "some arrays in this document...",
tags: ["elasticsearch", "wow"],
lists: [
{
name: "prog_list",
description: "programming list",
},
{
name: "cool_list",
description: "cool stuff list",
},
],
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 2,
document: {
message: "no arrays in this document...",
tags: "elasticsearch",
lists: {
name: "prog_list",
description: "programming list",
},
},
});
console.log(response1);
const response2 = await client.search({
index: "my-index-000001",
query: {
match: {
tags: "elasticsearch",
},
},
});
console.log(response2);
コンソール
PUT my-index-000001/_doc/1
{
"message": "some arrays in this document...",
"tags": [ "elasticsearch", "wow" ],
"lists": [
{
"name": "prog_list",
"description": "programming list"
},
{
"name": "cool_list",
"description": "cool stuff list"
}
]
}
PUT my-index-000001/_doc/2
{
"message": "no arrays in this document...",
"tags": "elasticsearch",
"lists": {
"name": "prog_list",
"description": "programming list"
}
}
GET my-index-000001/_search
{
"query": {
"match": {
"tags": "elasticsearch"
}
}
}
tags フィールドは string フィールドとして動的に追加されます。 |
|
lists フィールドは object フィールドとして動的に追加されます。 |
|
2番目のドキュメントには配列が含まれていませんが、同じフィールドにインデックスを付けることができます。 | |
クエリは elasticsearch を tags フィールドで探し、両方のドキュメントに一致します。 |