ジオバウンディングボックスクエリ
geo_point
と geo_shape
の値がバウンディングボックスと交差する場合に一致します。
例
次のドキュメントがインデックスされています:
Python
resp = client.indices.create(
index="my_locations",
mappings={
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
},
)
print(resp)
resp1 = client.index(
index="my_locations",
id="1",
document={
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
},
)
print(resp1)
resp2 = client.indices.create(
index="my_geoshapes",
mappings={
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
}
},
)
print(resp2)
resp3 = client.index(
index="my_geoshapes",
id="1",
document={
"pin": {
"location": {
"type": "polygon",
"coordinates": [
[
[
13,
51.5
],
[
15,
51.5
],
[
15,
54
],
[
13,
54
],
[
13,
51.5
]
]
]
}
}
},
)
print(resp3)
Ruby
response = client.indices.create(
index: 'my_locations',
body: {
mappings: {
properties: {
pin: {
properties: {
location: {
type: 'geo_point'
}
}
}
}
}
}
)
puts response
response = client.index(
index: 'my_locations',
id: 1,
body: {
pin: {
location: {
lat: 40.12,
lon: -71.34
}
}
}
)
puts response
response = client.indices.create(
index: 'my_geoshapes',
body: {
mappings: {
properties: {
pin: {
properties: {
location: {
type: 'geo_shape'
}
}
}
}
}
}
)
puts response
response = client.index(
index: 'my_geoshapes',
id: 1,
body: {
pin: {
location: {
type: 'polygon',
coordinates: [
[
[
13,
51.5
],
[
15,
51.5
],
[
15,
54
],
[
13,
54
],
[
13,
51.5
]
]
]
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my_locations",
mappings: {
properties: {
pin: {
properties: {
location: {
type: "geo_point",
},
},
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my_locations",
id: 1,
document: {
pin: {
location: {
lat: 40.12,
lon: -71.34,
},
},
},
});
console.log(response1);
const response2 = await client.indices.create({
index: "my_geoshapes",
mappings: {
properties: {
pin: {
properties: {
location: {
type: "geo_shape",
},
},
},
},
},
});
console.log(response2);
const response3 = await client.index({
index: "my_geoshapes",
id: 1,
document: {
pin: {
location: {
type: "polygon",
coordinates: [
[
[13, 51.5],
[15, 51.5],
[15, 54],
[13, 54],
[13, 51.5],
],
],
},
},
},
});
console.log(response3);
コンソール
PUT /my_locations
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
}
PUT /my_locations/_doc/1
{
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
}
PUT /my_geoshapes
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
}
}
}
PUT /my_geoshapes/_doc/1
{
"pin": {
"location": {
"type" : "polygon",
"coordinates" : [[[13.0 ,51.5], [15.0, 51.5], [15.0, 54.0], [13.0, 54.0], [13.0 ,51.5]]]
}
}
}
geo_bounding_box
フィルターを使用して、バウンディングボックスと交差する geo_point
値を一致させます。ボックスを定義するには、2つの対角のコーナーのジオポイント値を提供します。
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_bounding_box: {
'pin.location' => {
top_left: {
lat: 40.73,
lon: -74.1
},
bottom_right: {
lat: 40.01,
lon: -71.12
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_bounding_box: {
"pin.location": {
top_left: {
lat: 40.73,
lon: -74.1,
},
bottom_right: {
lat: 40.01,
lon: -71.12,
},
},
},
},
},
},
});
console.log(response);
コンソール
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
}
}
同じフィルターを使用して、バウンディングボックスと交差する geo_shape
値を一致させます:
Python
resp = client.search(
index="my_geoshapes",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_geoshapes',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_bounding_box: {
'pin.location' => {
top_left: {
lat: 40.73,
lon: -74.1
},
bottom_right: {
lat: 40.01,
lon: -71.12
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_geoshapes",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_bounding_box: {
"pin.location": {
top_left: {
lat: 40.73,
lon: -74.1,
},
bottom_right: {
lat: 40.01,
lon: -71.12,
},
},
},
},
},
},
});
console.log(response);
コンソール
GET my_geoshapes/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
}
}
geo_point
と geo_shape
の両方の値を一致させるには、両方のインデックスを検索します:
Python
resp = client.search(
index="my_locations,my_geoshapes",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations,my_geoshapes',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_bounding_box: {
'pin.location' => {
top_left: {
lat: 40.73,
lon: -74.1
},
bottom_right: {
lat: 40.01,
lon: -71.12
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations,my_geoshapes",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_bounding_box: {
"pin.location": {
top_left: {
lat: 40.73,
lon: -74.1,
},
bottom_right: {
lat: 40.01,
lon: -71.12,
},
},
},
},
},
},
});
console.log(response);
コンソール
GET my_locations,my_geoshapes/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
}
}
クエリオプション
オプション | 説明 |
---|---|
_name |
フィルターを識別するためのオプションの名前フィールド |
validation_method |
無効な緯度または経度を持つジオポイントを受け入れるには IGNORE_MALFORMED に設定し、正しい緯度または経度を推測しようとするには COERCE に設定します。(デフォルトは STRICT です)。 |
受け入れられるフォーマット
geo_point
タイプがジオポイントの異なる表現を受け入れるのと同様に、フィルターもそれを受け入れることができます:
プロパティとしての緯度経度
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_bounding_box: {
'pin.location' => {
top_left: {
lat: 40.73,
lon: -74.1
},
bottom_right: {
lat: 40.01,
lon: -71.12
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_bounding_box: {
"pin.location": {
top_left: {
lat: 40.73,
lon: -74.1,
},
bottom_right: {
lat: 40.01,
lon: -71.12,
},
},
},
},
},
},
});
console.log(response);
コンソール
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": {
"lat": 40.73,
"lon": -74.1
},
"bottom_right": {
"lat": 40.01,
"lon": -71.12
}
}
}
}
}
}
}
配列としての緯度経度
[lon, lat]
形式、ここでの緯度/経度の順序に注意して、GeoJSON に準拠します。
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": [
-74.1,
40.73
],
"bottom_right": [
-71.12,
40.01
]
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_bounding_box: {
'pin.location' => {
top_left: [
-74.1,
40.73
],
bottom_right: [
-71.12,
40.01
]
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_bounding_box: {
"pin.location": {
top_left: [-74.1, 40.73],
bottom_right: [-71.12, 40.01],
},
},
},
},
},
});
console.log(response);
コンソール
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": [ -74.1, 40.73 ],
"bottom_right": [ -71.12, 40.01 ]
}
}
}
}
}
}
文字列としての緯度経度
lat,lon
形式。
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": "POINT (-74.1 40.73)",
"bottom_right": "POINT (-71.12 40.01)"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_bounding_box: {
'pin.location' => {
top_left: 'POINT (-74.1 40.73)',
bottom_right: 'POINT (-71.12 40.01)'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_bounding_box: {
"pin.location": {
top_left: "POINT (-74.1 40.73)",
bottom_right: "POINT (-71.12 40.01)",
},
},
},
},
},
});
console.log(response);
コンソール
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": "POINT (-74.1 40.73)",
"bottom_right": "POINT (-71.12 40.01)"
}
}
}
}
}
}
よく知られたテキスト (WKT) としてのバウンディングボックス
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"wkt": "BBOX (-74.1, -71.12, 40.73, 40.01)"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_bounding_box: {
'pin.location' => {
wkt: 'BBOX (-74.1, -71.12, 40.73, 40.01)'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_bounding_box: {
"pin.location": {
wkt: "BBOX (-74.1, -71.12, 40.73, 40.01)",
},
},
},
},
},
});
console.log(response);
コンソール
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"wkt": "BBOX (-74.1, -71.12, 40.73, 40.01)"
}
}
}
}
}
}
ジオハッシュ
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": "dr5r9ydj2y73",
"bottom_right": "drj7teegpus6"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_bounding_box: {
'pin.location' => {
top_left: 'dr5r9ydj2y73',
bottom_right: 'drj7teegpus6'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_bounding_box: {
"pin.location": {
top_left: "dr5r9ydj2y73",
bottom_right: "drj7teegpus6",
},
},
},
},
},
});
console.log(response);
コンソール
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top_left": "dr5r9ydj2y73",
"bottom_right": "drj7teegpus6"
}
}
}
}
}
}
ジオハッシュがバウンディングボックスのエッジを指定するために使用されると、ジオハッシュは長方形として扱われます。バウンディングボックスは、top_left
パラメータで指定されたジオハッシュの左上隅に対応するように定義され、その右下は bottom_right
パラメータで指定されたジオハッシュの右下として定義されます。
ジオハッシュ全体のエリアに一致するバウンディングボックスを指定するには、ジオハッシュを top_left
および bottom_right
パラメータの両方で指定できます:
Python
resp = client.search(
index="my_locations",
query={
"geo_bounding_box": {
"pin.location": {
"top_left": "dr",
"bottom_right": "dr"
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
geo_bounding_box: {
'pin.location' => {
top_left: 'dr',
bottom_right: 'dr'
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
geo_bounding_box: {
"pin.location": {
top_left: "dr",
bottom_right: "dr",
},
},
},
});
console.log(response);
コンソール
GET my_locations/_search
{
"query": {
"geo_bounding_box": {
"pin.location": {
"top_left": "dr",
"bottom_right": "dr"
}
}
}
}
この例では、ジオハッシュ dr
が 45.0,-78.75
で左上隅を、39.375,-67.5
で右下隅を持つバウンディングボックスクエリを生成します。
頂点
バウンディングボックスの頂点は、top_left
と bottom_right
または top_right
と bottom_left
パラメータによって設定できます。値をペアで設定する代わりに、top
、left
、bottom
、right
の単純な名前を使用して、値を個別に設定できます。
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top": 40.73,
"left": -74.1,
"bottom": 40.01,
"right": -71.12
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_bounding_box: {
'pin.location' => {
top: 40.73,
left: -74.1,
bottom: 40.01,
right: -71.12
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_bounding_box: {
"pin.location": {
top: 40.73,
left: -74.1,
bottom: 40.01,
right: -71.12,
},
},
},
},
},
});
console.log(response);
コンソール
GET my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_bounding_box": {
"pin.location": {
"top": 40.73,
"left": -74.1,
"bottom": 40.01,
"right": -71.12
}
}
}
}
}
}
ドキュメントごとの複数の位置
フィルターは、ドキュメントごとに複数の位置/ポイントで機能します。単一の位置/ポイントがフィルターに一致すると、そのドキュメントはフィルターに含まれます。
未マップを無視
true
に設定すると、ignore_unmapped
オプションは未マップフィールドを無視し、このクエリに対してドキュメントと一致しません。これは、異なるマッピングを持つ複数のインデックスをクエリする際に便利です。false
に設定すると(デフォルト値)、フィールドがマップされていない場合、クエリは例外をスローします。
精度に関する注意
ジオポイントは限られた精度を持ち、インデックス時に常に切り捨てられます。クエリ時には、バウンディングボックスの上限が切り捨てられ、下限が切り上げられます。その結果、下限(バウンディングボックスの下部および左側のエッジ)に沿ったポイントは、切り捨て誤差のためにバウンディングボックスに入らない可能性があります。同時に、上限(上部および右側のエッジ)に沿ったポイントは、エッジの外側にわずかに位置していてもクエリによって選択される可能性があります。切り捨て誤差は、緯度で 4.20e-8 度未満、経度で 8.39e-8 度未満である必要があり、これは赤道上であっても 1cm 未満の誤差に相当します。
ジオシェイプも切り捨てのために限られた精度を持っています。バウンディングボックスの下部および左側のエッジに沿ったジオシェイプのエッジは geo_bounding_box
クエリと一致しない可能性があります。バウンディングボックスの上部および右側のエッジの外側にわずかに位置するジオシェイプのエッジは、クエリと一致する可能性があります。