ジオセントロイド集約
ジオフィールドのすべての座標値から加重された セントロイド を計算するメトリック集約です。
例:
Python
resp = client.indices.create(
index="museums",
mappings={
"properties": {
"location": {
"type": "geo_point"
}
}
},
)
print(resp)
resp1 = client.bulk(
index="museums",
refresh=True,
operations=[
{
"index": {
"_id": 1
}
},
{
"location": "POINT (4.912350 52.374081)",
"city": "Amsterdam",
"name": "NEMO Science Museum"
},
{
"index": {
"_id": 2
}
},
{
"location": "POINT (4.901618 52.369219)",
"city": "Amsterdam",
"name": "Museum Het Rembrandthuis"
},
{
"index": {
"_id": 3
}
},
{
"location": "POINT (4.914722 52.371667)",
"city": "Amsterdam",
"name": "Nederlands Scheepvaartmuseum"
},
{
"index": {
"_id": 4
}
},
{
"location": "POINT (4.405200 51.222900)",
"city": "Antwerp",
"name": "Letterenhuis"
},
{
"index": {
"_id": 5
}
},
{
"location": "POINT (2.336389 48.861111)",
"city": "Paris",
"name": "Musée du Louvre"
},
{
"index": {
"_id": 6
}
},
{
"location": "POINT (2.327000 48.860000)",
"city": "Paris",
"name": "Musée d'Orsay"
}
],
)
print(resp1)
resp2 = client.search(
index="museums",
size="0",
aggs={
"centroid": {
"geo_centroid": {
"field": "location"
}
}
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'museums',
body: {
mappings: {
properties: {
location: {
type: 'geo_point'
}
}
}
}
)
puts response
response = client.bulk(
index: 'museums',
refresh: true,
body: [
{
index: {
_id: 1
}
},
{
location: 'POINT (4.912350 52.374081)',
city: 'Amsterdam',
name: 'NEMO Science Museum'
},
{
index: {
_id: 2
}
},
{
location: 'POINT (4.901618 52.369219)',
city: 'Amsterdam',
name: 'Museum Het Rembrandthuis'
},
{
index: {
_id: 3
}
},
{
location: 'POINT (4.914722 52.371667)',
city: 'Amsterdam',
name: 'Nederlands Scheepvaartmuseum'
},
{
index: {
_id: 4
}
},
{
location: 'POINT (4.405200 51.222900)',
city: 'Antwerp',
name: 'Letterenhuis'
},
{
index: {
_id: 5
}
},
{
location: 'POINT (2.336389 48.861111)',
city: 'Paris',
name: 'Musée du Louvre'
},
{
index: {
_id: 6
}
},
{
location: 'POINT (2.327000 48.860000)',
city: 'Paris',
name: "Musée d'Orsay"
}
]
)
puts response
response = client.search(
index: 'museums',
size: 0,
body: {
aggregations: {
centroid: {
geo_centroid: {
field: 'location'
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "museums",
mappings: {
properties: {
location: {
type: "geo_point",
},
},
},
});
console.log(response);
const response1 = await client.bulk({
index: "museums",
refresh: "true",
operations: [
{
index: {
_id: 1,
},
},
{
location: "POINT (4.912350 52.374081)",
city: "Amsterdam",
name: "NEMO Science Museum",
},
{
index: {
_id: 2,
},
},
{
location: "POINT (4.901618 52.369219)",
city: "Amsterdam",
name: "Museum Het Rembrandthuis",
},
{
index: {
_id: 3,
},
},
{
location: "POINT (4.914722 52.371667)",
city: "Amsterdam",
name: "Nederlands Scheepvaartmuseum",
},
{
index: {
_id: 4,
},
},
{
location: "POINT (4.405200 51.222900)",
city: "Antwerp",
name: "Letterenhuis",
},
{
index: {
_id: 5,
},
},
{
location: "POINT (2.336389 48.861111)",
city: "Paris",
name: "Musée du Louvre",
},
{
index: {
_id: 6,
},
},
{
location: "POINT (2.327000 48.860000)",
city: "Paris",
name: "Musée d'Orsay",
},
],
});
console.log(response1);
const response2 = await client.search({
index: "museums",
size: 0,
aggs: {
centroid: {
geo_centroid: {
field: "location",
},
},
},
});
console.log(response2);
コンソール
PUT /museums
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
POST /museums/_bulk?refresh
{"index":{"_id":1}}
{"location": "POINT (4.912350 52.374081)", "city": "Amsterdam", "name": "NEMO Science Museum"}
{"index":{"_id":2}}
{"location": "POINT (4.901618 52.369219)", "city": "Amsterdam", "name": "Museum Het Rembrandthuis"}
{"index":{"_id":3}}
{"location": "POINT (4.914722 52.371667)", "city": "Amsterdam", "name": "Nederlands Scheepvaartmuseum"}
{"index":{"_id":4}}
{"location": "POINT (4.405200 51.222900)", "city": "Antwerp", "name": "Letterenhuis"}
{"index":{"_id":5}}
{"location": "POINT (2.336389 48.861111)", "city": "Paris", "name": "Musée du Louvre"}
{"index":{"_id":6}}
{"location": "POINT (2.327000 48.860000)", "city": "Paris", "name": "Musée d'Orsay"}
POST /museums/_search?size=0
{
"aggs": {
"centroid": {
"geo_centroid": {
"field": "location"
}
}
}
}
geo_centroid 集約はセントロイドを計算するために使用するフィールドを指定します。(注: フィールドは ジオポイント タイプでなければなりません) |
上記の集約は、すべての博物館の文書の位置フィールドのセントロイドを計算する方法を示しています。
コンソール-結果
{
...
"aggregations": {
"centroid": {
"location": {
"lat": 51.00982965203002,
"lon": 3.9662131341174245
},
"count": 6
}
}
}
geo_centroid
集約は、他のバケット集約にサブ集約として組み合わせると、より興味深いものになります。
例:
Python
resp = client.search(
index="museums",
size="0",
aggs={
"cities": {
"terms": {
"field": "city.keyword"
},
"aggs": {
"centroid": {
"geo_centroid": {
"field": "location"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'museums',
size: 0,
body: {
aggregations: {
cities: {
terms: {
field: 'city.keyword'
},
aggregations: {
centroid: {
geo_centroid: {
field: 'location'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "museums",
size: 0,
aggs: {
cities: {
terms: {
field: "city.keyword",
},
aggs: {
centroid: {
geo_centroid: {
field: "location",
},
},
},
},
},
});
console.log(response);
コンソール
POST /museums/_search?size=0
{
"aggs": {
"cities": {
"terms": { "field": "city.keyword" },
"aggs": {
"centroid": {
"geo_centroid": { "field": "location" }
}
}
}
}
}
上記の例では、geo_centroid
を terms バケット集約のサブ集約として使用して、各都市の博物館の中心位置を見つけています。
コンソール-結果
{
...
"aggregations": {
"cities": {
"sum_other_doc_count": 0,
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "Amsterdam",
"doc_count": 3,
"centroid": {
"location": {
"lat": 52.371655656024814,
"lon": 4.909563297405839
},
"count": 3
}
},
{
"key": "Paris",
"doc_count": 2,
"centroid": {
"location": {
"lat": 48.86055548675358,
"lon": 2.3316944623366
},
"count": 2
}
},
{
"key": "Antwerp",
"doc_count": 1,
"centroid": {
"location": {
"lat": 51.22289997059852,
"lon": 4.40519998781383
},
"count": 1
}
}
]
}
}
}
geo_shape フィールドのジオセントロイド集約
ジオシェイプのセントロイドメトリックは、ポイントのそれよりも複雑です。特定の集約バケットに含まれるシェイプのセントロイドは、バケット内の最高次元のシェイプタイプのセントロイドです。たとえば、バケットにポリゴンとラインからなるシェイプが含まれている場合、ラインはセントロイドメトリックに寄与しません。各シェイプタイプのセントロイドは異なる方法で計算されます。Circle を介して取り込まれたエンベロープと円はポリゴンとして扱われます。
ジオメトリタイプ | セントロイド計算 |
---|---|
[Multi]Point | すべての座標の等重み平均 |
[Multi]LineString | 各セグメントのセントロイドの加重平均で、各セグメントの重みはその長さ(度)です |
[Multi]Polygon | ポリゴンのすべての三角形のセントロイドの加重平均で、三角形は2つの連続した頂点と開始点によって形成されます。 ホールは負の重みを持ちます。重みは、deg^2 で計算された三角形の面積を表します |
GeometryCollection | 最高次元のすべての基礎となるジオメトリのセントロイド。ポリゴンとラインおよび/またはポイントがある場合、ラインおよび/またはポイントは無視されます。 ラインとポイントがある場合、ポイントは無視されます |
例:
Python
resp = client.indices.create(
index="places",
mappings={
"properties": {
"geometry": {
"type": "geo_shape"
}
}
},
)
print(resp)
resp1 = client.bulk(
index="places",
refresh=True,
operations=[
{
"index": {
"_id": 1
}
},
{
"name": "NEMO Science Museum",
"geometry": "POINT(4.912350 52.374081)"
},
{
"index": {
"_id": 2
}
},
{
"name": "Sportpark De Weeren",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
4.965305328369141,
52.39347642069457
],
[
4.966979026794433,
52.391721758934835
],
[
4.969425201416015,
52.39238958618537
],
[
4.967944622039794,
52.39420969150824
],
[
4.965305328369141,
52.39347642069457
]
]
]
}
}
],
)
print(resp1)
resp2 = client.search(
index="places",
size="0",
aggs={
"centroid": {
"geo_centroid": {
"field": "geometry"
}
}
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'places',
body: {
mappings: {
properties: {
geometry: {
type: 'geo_shape'
}
}
}
}
)
puts response
response = client.bulk(
index: 'places',
refresh: true,
body: [
{
index: {
_id: 1
}
},
{
name: 'NEMO Science Museum',
geometry: 'POINT(4.912350 52.374081)'
},
{
index: {
_id: 2
}
},
{
name: 'Sportpark De Weeren',
geometry: {
type: 'Polygon',
coordinates: [
[
[
4.965305328369141,
52.39347642069457
],
[
4.966979026794433,
52.391721758934835
],
[
4.969425201416015,
52.39238958618537
],
[
4.967944622039794,
52.39420969150824
],
[
4.965305328369141,
52.39347642069457
]
]
]
}
}
]
)
puts response
response = client.search(
index: 'places',
size: 0,
body: {
aggregations: {
centroid: {
geo_centroid: {
field: 'geometry'
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "places",
mappings: {
properties: {
geometry: {
type: "geo_shape",
},
},
},
});
console.log(response);
const response1 = await client.bulk({
index: "places",
refresh: "true",
operations: [
{
index: {
_id: 1,
},
},
{
name: "NEMO Science Museum",
geometry: "POINT(4.912350 52.374081)",
},
{
index: {
_id: 2,
},
},
{
name: "Sportpark De Weeren",
geometry: {
type: "Polygon",
coordinates: [
[
[4.965305328369141, 52.39347642069457],
[4.966979026794433, 52.391721758934835],
[4.969425201416015, 52.39238958618537],
[4.967944622039794, 52.39420969150824],
[4.965305328369141, 52.39347642069457],
],
],
},
},
],
});
console.log(response1);
const response2 = await client.search({
index: "places",
size: 0,
aggs: {
centroid: {
geo_centroid: {
field: "geometry",
},
},
},
});
console.log(response2);
コンソール
PUT /places
{
"mappings": {
"properties": {
"geometry": {
"type": "geo_shape"
}
}
}
}
POST /places/_bulk?refresh
{"index":{"_id":1}}
{"name": "NEMO Science Museum", "geometry": "POINT(4.912350 52.374081)" }
{"index":{"_id":2}}
{"name": "Sportpark De Weeren", "geometry": { "type": "Polygon", "coordinates": [ [ [ 4.965305328369141, 52.39347642069457 ], [ 4.966979026794433, 52.391721758934835 ], [ 4.969425201416015, 52.39238958618537 ], [ 4.967944622039794, 52.39420969150824 ], [ 4.965305328369141, 52.39347642069457 ] ] ] } }
POST /places/_search?size=0
{
"aggs": {
"centroid": {
"geo_centroid": {
"field": "geometry"
}
}
}
}
コンソール-結果
{
...
"aggregations": {
"centroid": {
"location": {
"lat": 52.39296147599816,
"lon": 4.967404240742326
},
"count": 2
}
}
}
geohash_grid のサブ集約としての geo_centroid の使用
geohash_grid
集約は、個々のジオポイントではなく、文書をバケットに配置します。文書の geo_point
フィールドに 複数の値 が含まれている場合、文書は複数のバケットに割り当てられる可能性があります。たとえそのジオポイントの1つ以上がバケットの境界の外にあってもです。
geocentroid
サブ集約も使用される場合、各セントロイドはバケット内のすべてのジオポイントを使用して計算され、バケットの境界の外にあるものも含まれます。これにより、バケットの境界の外にセントロイドが生成される可能性があります。