フィルター集約
各バケットが クエリ に一致するドキュメントを含むマルチバケット集約です。
例:
Python
resp = client.bulk(
index="logs",
refresh=True,
operations=[
{
"index": {
"_id": 1
}
},
{
"body": "warning: page could not be rendered"
},
{
"index": {
"_id": 2
}
},
{
"body": "authentication error"
},
{
"index": {
"_id": 3
}
},
{
"body": "warning: connection timed out"
}
],
)
print(resp)
resp1 = client.search(
index="logs",
size=0,
aggs={
"messages": {
"filters": {
"filters": {
"errors": {
"match": {
"body": "error"
}
},
"warnings": {
"match": {
"body": "warning"
}
}
}
}
}
},
)
print(resp1)
Ruby
response = client.bulk(
index: 'logs',
refresh: true,
body: [
{
index: {
_id: 1
}
},
{
body: 'warning: page could not be rendered'
},
{
index: {
_id: 2
}
},
{
body: 'authentication error'
},
{
index: {
_id: 3
}
},
{
body: 'warning: connection timed out'
}
]
)
puts response
response = client.search(
index: 'logs',
body: {
size: 0,
aggregations: {
messages: {
filters: {
filters: {
errors: {
match: {
body: 'error'
}
},
warnings: {
match: {
body: 'warning'
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.bulk({
index: "logs",
refresh: "true",
operations: [
{
index: {
_id: 1,
},
},
{
body: "warning: page could not be rendered",
},
{
index: {
_id: 2,
},
},
{
body: "authentication error",
},
{
index: {
_id: 3,
},
},
{
body: "warning: connection timed out",
},
],
});
console.log(response);
const response1 = await client.search({
index: "logs",
size: 0,
aggs: {
messages: {
filters: {
filters: {
errors: {
match: {
body: "error",
},
},
warnings: {
match: {
body: "warning",
},
},
},
},
},
},
});
console.log(response1);
コンソール
PUT /logs/_bulk?refresh
{ "index" : { "_id" : 1 } }
{ "body" : "warning: page could not be rendered" }
{ "index" : { "_id" : 2 } }
{ "body" : "authentication error" }
{ "index" : { "_id" : 3 } }
{ "body" : "warning: connection timed out" }
GET logs/_search
{
"size": 0,
"aggs" : {
"messages" : {
"filters" : {
"filters" : {
"errors" : { "match" : { "body" : "error" }},
"warnings" : { "match" : { "body" : "warning" }}
}
}
}
}
}
上記の例では、ログメッセージを分析します。集約は、エラーを含むすべてのログメッセージのコレクション(バケット)と、警告を含むすべてのログメッセージのコレクションの2つを構築します。
コンソール-結果
{
"took": 9,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"messages": {
"buckets": {
"errors": {
"doc_count": 1
},
"warnings": {
"doc_count": 2
}
}
}
}
}
匿名フィルター
フィルターフィールドは、次のリクエストのようにフィルターの配列として提供することもできます:
Python
resp = client.search(
index="logs",
size=0,
aggs={
"messages": {
"filters": {
"filters": [
{
"match": {
"body": "error"
}
},
{
"match": {
"body": "warning"
}
}
]
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'logs',
body: {
size: 0,
aggregations: {
messages: {
filters: {
filters: [
{
match: {
body: 'error'
}
},
{
match: {
body: 'warning'
}
}
]
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "logs",
size: 0,
aggs: {
messages: {
filters: {
filters: [
{
match: {
body: "error",
},
},
{
match: {
body: "warning",
},
},
],
},
},
},
});
console.log(response);
コンソール
GET logs/_search
{
"size": 0,
"aggs" : {
"messages" : {
"filters" : {
"filters" : [
{ "match" : { "body" : "error" }},
{ "match" : { "body" : "warning" }}
]
}
}
}
}
フィルタリングされたバケットは、リクエストで提供されたのと同じ順序で返されます。この例のレスポンスは次のようになります:
コンソール-結果
{
"took": 4,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"messages": {
"buckets": [
{
"doc_count": 1
},
{
"doc_count": 2
}
]
}
}
}
その他のバケット
other_bucket
パラメータを設定すると、指定されたフィルターのいずれにも一致しないすべてのドキュメントを含むバケットをレスポンスに追加できます。このパラメータの値は次のようになります:
false
other
バケットを計算しないtrue
- 名前付きフィルターが使用されている場合は、
_other_
(デフォルト名)という名前のバケットに、匿名フィルターが使用されている場合は最後のバケットとしてother
バケットを返します
other_bucket_key
パラメータを使用して、other
バケットのキーをデフォルトの _other_
以外の値に設定できます。このパラメータを設定すると、other_bucket
パラメータが true
に暗黙的に設定されます。
次のスニペットは、other
バケットが other_messages
という名前で要求されるレスポンスを示しています。
Python
resp = client.index(
index="logs",
id="4",
refresh=True,
document={
"body": "info: user Bob logged out"
},
)
print(resp)
resp1 = client.search(
index="logs",
size=0,
aggs={
"messages": {
"filters": {
"other_bucket_key": "other_messages",
"filters": {
"errors": {
"match": {
"body": "error"
}
},
"warnings": {
"match": {
"body": "warning"
}
}
}
}
}
},
)
print(resp1)
Ruby
response = client.index(
index: 'logs',
id: 4,
refresh: true,
body: {
body: 'info: user Bob logged out'
}
)
puts response
response = client.search(
index: 'logs',
body: {
size: 0,
aggregations: {
messages: {
filters: {
other_bucket_key: 'other_messages',
filters: {
errors: {
match: {
body: 'error'
}
},
warnings: {
match: {
body: 'warning'
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.index({
index: "logs",
id: 4,
refresh: "true",
document: {
body: "info: user Bob logged out",
},
});
console.log(response);
const response1 = await client.search({
index: "logs",
size: 0,
aggs: {
messages: {
filters: {
other_bucket_key: "other_messages",
filters: {
errors: {
match: {
body: "error",
},
},
warnings: {
match: {
body: "warning",
},
},
},
},
},
},
});
console.log(response1);
コンソール
PUT logs/_doc/4?refresh
{
"body": "info: user Bob logged out"
}
GET logs/_search
{
"size": 0,
"aggs" : {
"messages" : {
"filters" : {
"other_bucket_key": "other_messages",
"filters" : {
"errors" : { "match" : { "body" : "error" }},
"warnings" : { "match" : { "body" : "warning" }}
}
}
}
}
}
コンソール-結果
{
"took": 3,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"messages": {
"buckets": {
"errors": {
"doc_count": 1
},
"warnings": {
"doc_count": 2
},
"other_messages": {
"doc_count": 1
}
}
}
}
}
非キー応答
デフォルトでは、名前付きフィルター集約はバケットをオブジェクトとして返します。しかし、バケットソート のような一部のソートケースでは、JSONはオブジェクト内の要素の順序を保証しません。keyed
パラメータを使用して、バケットをオブジェクトの配列として指定できます。このパラメータの値は次のようになります:
true
- (デフォルト)バケットをオブジェクトとして返す
false
- バケットをオブジェクトの配列として返す
このパラメータは 匿名フィルター によって無視されます。
例:
Python
resp = client.search(
index="sales",
size="0",
filter_path="aggregations",
aggs={
"the_filter": {
"filters": {
"keyed": False,
"filters": {
"t-shirt": {
"term": {
"type": "t-shirt"
}
},
"hat": {
"term": {
"type": "hat"
}
}
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"sort_by_avg_price": {
"bucket_sort": {
"sort": {
"avg_price": "asc"
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'sales',
size: 0,
filter_path: 'aggregations',
body: {
aggregations: {
the_filter: {
filters: {
keyed: false,
filters: {
"t-shirt": {
term: {
type: 't-shirt'
}
},
hat: {
term: {
type: 'hat'
}
}
}
},
aggregations: {
avg_price: {
avg: {
field: 'price'
}
},
sort_by_avg_price: {
bucket_sort: {
sort: {
avg_price: 'asc'
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "sales",
size: 0,
filter_path: "aggregations",
aggs: {
the_filter: {
filters: {
keyed: false,
filters: {
"t-shirt": {
term: {
type: "t-shirt",
},
},
hat: {
term: {
type: "hat",
},
},
},
},
aggs: {
avg_price: {
avg: {
field: "price",
},
},
sort_by_avg_price: {
bucket_sort: {
sort: {
avg_price: "asc",
},
},
},
},
},
},
});
console.log(response);
コンソール
POST /sales/_search?size=0&filter_path=aggregations
{
"aggs": {
"the_filter": {
"filters": {
"keyed": false,
"filters": {
"t-shirt": { "term": { "type": "t-shirt" } },
"hat": { "term": { "type": "hat" } }
}
},
"aggs": {
"avg_price": { "avg": { "field": "price" } },
"sort_by_avg_price": {
"bucket_sort": { "sort": { "avg_price": "asc" } }
}
}
}
}
}
コンソール-結果
{
"aggregations": {
"the_filter": {
"buckets": [
{
"key": "t-shirt",
"doc_count": 3,
"avg_price": { "value": 128.33333333333334 }
},
{
"key": "hat",
"doc_count": 3,
"avg_price": { "value": 150.0 }
}
]
}
}
}