ジオポイントフィールドタイプ
タイプ geo_point
のフィールドは、緯度-経度ペアを受け入れ、次のように使用できます:
- バウンディングボックス 内のジオポイントを見つけるため、中央点からの特定の距離内、または
geo_shape
クエリ 内(例えば、ポリゴン内のポイント)。 - 中央点からの距離によってドキュメントを集約するため。
- 地理グリッドによってドキュメントを集約するため:
geo_hash
、geo_tile
またはgeo_hex
。 - メトリクス集約
geo_line
を使用してジオポイントをトラックに集約するため。 - ドキュメントの関連スコアに距離を統合するため。
- 距離によってドキュメントをソートするため。
geo_shape や point と同様に、geo_point
は GeoJSON および Well-Known Text フォーマットで指定できます。ただし、便利さと歴史的理由からサポートされている追加のフォーマットがいくつかあります。ジオポイントを指定する方法は合計で6つあり、以下に示します:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"location": {
"type": "geo_point"
}
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"text": "Geopoint as an object using GeoJSON format",
"location": {
"type": "Point",
"coordinates": [
-71.34,
41.12
]
}
},
)
print(resp1)
resp2 = client.index(
index="my-index-000001",
id="2",
document={
"text": "Geopoint as a WKT POINT primitive",
"location": "POINT (-71.34 41.12)"
},
)
print(resp2)
resp3 = client.index(
index="my-index-000001",
id="3",
document={
"text": "Geopoint as an object with 'lat' and 'lon' keys",
"location": {
"lat": 41.12,
"lon": -71.34
}
},
)
print(resp3)
resp4 = client.index(
index="my-index-000001",
id="4",
document={
"text": "Geopoint as an array",
"location": [
-71.34,
41.12
]
},
)
print(resp4)
resp5 = client.index(
index="my-index-000001",
id="5",
document={
"text": "Geopoint as a string",
"location": "41.12,-71.34"
},
)
print(resp5)
resp6 = client.index(
index="my-index-000001",
id="6",
document={
"text": "Geopoint as a geohash",
"location": "drm3btev3e86"
},
)
print(resp6)
resp7 = client.search(
index="my-index-000001",
query={
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 42,
"lon": -72
},
"bottom_right": {
"lat": 40,
"lon": -74
}
}
}
},
)
print(resp7)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
location: {
type: 'geo_point'
}
}
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
text: 'Geopoint as an object using GeoJSON format',
location: {
type: 'Point',
coordinates: [
-71.34,
41.12
]
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 2,
body: {
text: 'Geopoint as a WKT POINT primitive',
location: 'POINT (-71.34 41.12)'
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 3,
body: {
text: "Geopoint as an object with 'lat' and 'lon' keys",
location: {
lat: 41.12,
lon: -71.34
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 4,
body: {
text: 'Geopoint as an array',
location: [
-71.34,
41.12
]
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 5,
body: {
text: 'Geopoint as a string',
location: '41.12,-71.34'
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 6,
body: {
text: 'Geopoint as a geohash',
location: 'drm3btev3e86'
}
)
puts response
response = client.search(
index: 'my-index-000001',
body: {
query: {
geo_bounding_box: {
location: {
top_left: {
lat: 42,
lon: -72
},
bottom_right: {
lat: 40,
lon: -74
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
location: {
type: "geo_point",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
text: "Geopoint as an object using GeoJSON format",
location: {
type: "Point",
coordinates: [-71.34, 41.12],
},
},
});
console.log(response1);
const response2 = await client.index({
index: "my-index-000001",
id: 2,
document: {
text: "Geopoint as a WKT POINT primitive",
location: "POINT (-71.34 41.12)",
},
});
console.log(response2);
const response3 = await client.index({
index: "my-index-000001",
id: 3,
document: {
text: "Geopoint as an object with 'lat' and 'lon' keys",
location: {
lat: 41.12,
lon: -71.34,
},
},
});
console.log(response3);
const response4 = await client.index({
index: "my-index-000001",
id: 4,
document: {
text: "Geopoint as an array",
location: [-71.34, 41.12],
},
});
console.log(response4);
const response5 = await client.index({
index: "my-index-000001",
id: 5,
document: {
text: "Geopoint as a string",
location: "41.12,-71.34",
},
});
console.log(response5);
const response6 = await client.index({
index: "my-index-000001",
id: 6,
document: {
text: "Geopoint as a geohash",
location: "drm3btev3e86",
},
});
console.log(response6);
const response7 = await client.search({
index: "my-index-000001",
query: {
geo_bounding_box: {
location: {
top_left: {
lat: 42,
lon: -72,
},
bottom_right: {
lat: 40,
lon: -74,
},
},
},
},
});
console.log(response7);
コンソール
PUT my-index-000001
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
PUT my-index-000001/_doc/1
{
"text": "Geopoint as an object using GeoJSON format",
"location": {
"type": "Point",
"coordinates": [-71.34, 41.12]
}
}
PUT my-index-000001/_doc/2
{
"text": "Geopoint as a WKT POINT primitive",
"location" : "POINT (-71.34 41.12)"
}
PUT my-index-000001/_doc/3
{
"text": "Geopoint as an object with 'lat' and 'lon' keys",
"location": {
"lat": 41.12,
"lon": -71.34
}
}
PUT my-index-000001/_doc/4
{
"text": "Geopoint as an array",
"location": [ -71.34, 41.12 ]
}
PUT my-index-000001/_doc/5
{
"text": "Geopoint as a string",
"location": "41.12,-71.34"
}
PUT my-index-000001/_doc/6
{
"text": "Geopoint as a geohash",
"location": "drm3btev3e86"
}
GET my-index-000001/_search
{
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 42,
"lon": -72
},
"bottom_right": {
"lat": 40,
"lon": -74
}
}
}
}
}
GeoJSON フォーマットで type および coordinates キーを持つオブジェクトとして表現されたジオポイント。 |
|
フォーマット:"POINT(lon lat)" の Well-Known Text 形式のジオポイント。 |
|
lat および lon キーを持つオブジェクトとして表現されたジオポイント。 |
|
フォーマット:[ lon , lat ] の配列として表現されたジオポイント。 |
|
フォーマット:"lat,lon" の文字列として表現されたジオポイント。 |
|
ジオハッシュとして表現されたジオポイント。 | |
ボックス内にあるすべてのジオポイントを見つけるジオバウンディングボックスクエリ。 |
配列または文字列として表現されたジオポイント
文字列ジオポイントは lat,lon
の順序で並べられますが、配列ジオポイント、GeoJSON および WKT は逆の順序で並べられます: lon,lat
。
その理由は歴史的なものです。地理学者は伝統的に latitude
を longitude
の前に書きますが、GeoJSON や Well-Known Text のような最近の地理データ用に指定されたフォーマットは、longitude
を latitude
の前に(東経が北緯の前)並べて、x
を y
の前に並べる数学的慣習に合わせています。
ポイントは ジオハッシュ として表現できます。ジオハッシュは、緯度と経度のビットを交互にエンコードした base32 形式の文字列です。ジオハッシュの各文字は精度に追加の5ビットを加えます。したがって、ハッシュが長いほど、より正確になります。インデックス作成の目的で、ジオハッシュは緯度-経度ペアに変換されます。このプロセス中、最初の12文字のみが使用されるため、ジオハッシュで12文字以上を指定しても精度は向上しません。12文字は60ビットを提供し、可能な誤差を2cm未満に減少させるはずです。
geo_point フィールドのパラメータ
次のパラメータは geo_point
フィールドで受け入れられます:
ignore_malformed |
true の場合、誤ったジオポイントは無視されます。false (デフォルト)の場合、誤ったジオポイントは例外をスローし、ドキュメント全体が拒否されます。 ジオポイントは、緯度が範囲 -90 ⇐ 緯度 ⇐ 90 の外にある場合、または経度が範囲 -180 ⇐ 経度 ⇐ 180 の外にある場合、誤っていると見なされます。 この設定は script パラメータが使用されている場合には設定できません。 |
ignore_z_value |
true (デフォルト)の場合、三次元ポイントが受け入れられ(ソースに保存されます)緯度と経度の値のみがインデックスされ、第三の次元は無視されます。 false の場合、緯度と経度(2次元)以外の値を含むジオポイントは例外をスローし、ドキュメント全体が拒否されます。この設定は script パラメータが使用されている場合には設定できません。 |
index |
フィールドは迅速に検索可能であるべきですか?true (デフォルト)および false を受け入れます。 doc_values のみが有効なフィールドは、クエリ可能ですが、遅くなります。 |
null_value |
明示的な null 値の代わりに置き換えられるジオポイント値を受け入れます。デフォルトは null で、これはフィールドが欠落していると見なされることを意味します。この設定は script パラメータが使用されている場合には設定できません。 |
on_script_error |
script パラメータによって定義されたスクリプトがインデックス作成時にエラーをスローした場合に何をするかを定義します。fail (デフォルト)を受け入れ、これによりドキュメント全体が拒否され、continue を受け入れ、これによりフィールドがドキュメントの_ignored メタデータフィールドに登録され、インデックス作成が続行されます。このパラメータは script フィールドが設定されている場合にのみ設定できます。 |
| script
| このパラメータが設定されている場合、フィールドはこのスクリプトによって生成された値をインデックスし、ソースから直接値を読み取るのではなくなります。入力ドキュメントでこのフィールドに値が設定されている場合、ドキュメントはエラーで拒否されます。
スクリプトはそのruntime equivalent と同じ形式であり、(lat, lon) のダブル値のペアとしてポイントを出力する必要があります。
スクリプトでのジオポイントの使用
スクリプト内でジオポイントの値にアクセスする際、値は GeoPoint
オブジェクトとして返され、.lat
および .lon
の値にそれぞれアクセスできます:
ペインレス
def geopoint = doc['location'].value;
def lat = geopoint.lat;
def lon = geopoint.lon;
パフォーマンスの理由から、lat/lon 値に直接アクセスする方が良いです:
ペインレス
def lat = doc['location'].lat;
def lon = doc['location'].lon;
合成ソース
合成 _source
は、一般的に TSDB インデックス(index.mode
が time_series
に設定されているインデックス)のみで利用可能です。他のインデックスでは、合成 _source
は技術プレビューにあります。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elastic は問題を修正するために作業しますが、技術プレビューの機能は公式 GA 機能のサポート SLA の対象ではありません。
geo_point
フィールドは、デフォルト構成で 合成 _source
をサポートします。合成 _source
は、copy_to
または doc_values
が無効な場合には使用できません。
合成ソースは常に geo_point
フィールドをソートし(最初に緯度、次に経度)、保存された精度に減少させます。例えば:
Python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"point": {
"type": "geo_point"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"point": [
{
"lat": -90,
"lon": -80
},
{
"lat": 10,
"lon": 30
}
]
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
},
properties: {
point: {
type: 'geo_point'
}
}
}
}
)
puts response
response = client.index(
index: 'idx',
id: 1,
body: {
point: [
{
lat: -90,
lon: -80
},
{
lat: 10,
lon: 30
}
]
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
point: {
type: "geo_point",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
point: [
{
lat: -90,
lon: -80,
},
{
lat: 10,
lon: 30,
},
],
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"point": { "type": "geo_point" }
}
}
}
PUT idx/_doc/1
{
"point": [
{"lat":-90, "lon":-80},
{"lat":10, "lon":30}
]
}
コンソール-結果
{
"point": [
{"lat":-90.0, "lon":-80.00000000931323},
{"lat":9.999999990686774, "lon":29.999999972060323}
]
}