ジオシェイプクエリ
geo_shape
または geo_point
タイプを使用してインデックスされたドキュメントをフィルタリングします。
geo_shape
クエリは、geo_shape
または geo_point
マッピングと同じ インデックス を使用して、クエリシェイプに関連するシェイプを持つドキュメントを見つけます。指定された 空間関係: 交差、包含、内部、または離散のいずれかを使用します。
クエリは、クエリシェイプを定義する2つの方法をサポートしています。全体のシェイプ定義を提供するか、別のインデックスに事前インデックスされたシェイプの名前を参照します。両方の形式は、以下に例とともに定義されています。
インラインシェイプ定義
[geo_point
] タイプに似て、geo_shape
クエリはシェイプを表すために GeoJSON を使用します。
次のインデックスが geo_shape
フィールドとして位置を持つ場合:
Python
resp = client.indices.create(
index="example",
mappings={
"properties": {
"location": {
"type": "geo_shape"
}
}
},
)
print(resp)
resp1 = client.index(
index="example",
refresh=True,
document={
"name": "Wind & Wetter, Berlin, Germany",
"location": {
"type": "point",
"coordinates": [
13.400544,
52.530286
]
}
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'example',
body: {
mappings: {
properties: {
location: {
type: 'geo_shape'
}
}
}
}
)
puts response
response = client.index(
index: 'example',
refresh: true,
body: {
name: 'Wind & Wetter, Berlin, Germany',
location: {
type: 'point',
coordinates: [
13.400544,
52.530286
]
}
}
)
puts response
Js
const response = await client.indices.create({
index: "example",
mappings: {
properties: {
location: {
type: "geo_shape",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "example",
refresh: "true",
document: {
name: "Wind & Wetter, Berlin, Germany",
location: {
type: "point",
coordinates: [13.400544, 52.530286],
},
},
});
console.log(response1);
コンソール
PUT /example
{
"mappings": {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
}
POST /example/_doc?refresh
{
"name": "Wind & Wetter, Berlin, Germany",
"location": {
"type": "point",
"coordinates": [ 13.400544, 52.530286 ]
}
}
次のクエリは、Elasticsearch の envelope
GeoJSON 拡張を使用してポイントを見つけます:
Python
resp = client.search(
index="example",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [
[
13,
53
],
[
14,
52
]
]
},
"relation": "within"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'example',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_shape: {
location: {
shape: {
type: 'envelope',
coordinates: [
[
13,
53
],
[
14,
52
]
]
},
relation: 'within'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "example",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_shape: {
location: {
shape: {
type: "envelope",
coordinates: [
[13, 53],
[14, 52],
],
},
relation: "within",
},
},
},
},
},
});
console.log(response);
コンソール
GET /example/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
},
"relation": "within"
}
}
}
}
}
}
上記のクエリは、同様に geo_point
フィールドでクエリできます。
Python
resp = client.indices.create(
index="example_points",
mappings={
"properties": {
"location": {
"type": "geo_point"
}
}
},
)
print(resp)
resp1 = client.index(
index="example_points",
id="1",
refresh=True,
document={
"name": "Wind & Wetter, Berlin, Germany",
"location": [
13.400544,
52.530286
]
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'example_points',
body: {
mappings: {
properties: {
location: {
type: 'geo_point'
}
}
}
}
)
puts response
response = client.index(
index: 'example_points',
id: 1,
refresh: true,
body: {
name: 'Wind & Wetter, Berlin, Germany',
location: [
13.400544,
52.530286
]
}
)
puts response
Js
const response = await client.indices.create({
index: "example_points",
mappings: {
properties: {
location: {
type: "geo_point",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "example_points",
id: 1,
refresh: "true",
document: {
name: "Wind & Wetter, Berlin, Germany",
location: [13.400544, 52.530286],
},
});
console.log(response1);
コンソール
PUT /example_points
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
PUT /example_points/_doc/1?refresh
{
"name": "Wind & Wetter, Berlin, Germany",
"location": [13.400544, 52.530286]
}
同じクエリを使用して、マッチする geo_point
フィールドを持つドキュメントが返されます。
Python
resp = client.search(
index="example_points",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [
[
13,
53
],
[
14,
52
]
]
},
"relation": "intersects"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'example_points',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_shape: {
location: {
shape: {
type: 'envelope',
coordinates: [
[
13,
53
],
[
14,
52
]
]
},
relation: 'intersects'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "example_points",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_shape: {
location: {
shape: {
type: "envelope",
coordinates: [
[13, 53],
[14, 52],
],
},
relation: "intersects",
},
},
},
},
},
});
console.log(response);
コンソール
GET /example_points/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
},
"relation": "intersects"
}
}
}
}
}
}
コンソール-結果
{
"took" : 17,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "example_points",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name": "Wind & Wetter, Berlin, Germany",
"location": [13.400544, 52.530286]
}
}
]
}
}
事前インデックスされたシェイプ
クエリは、別のインデックスにすでにインデックスされたシェイプを使用することもサポートしています。これは、事前定義されたシェイプのリストがあり、毎回座標を提供するのではなく論理名(例えば ニュージーランド)を使用してリストを参照したい場合に特に便利です。この場合、提供する必要があるのは次のとおりです:
id
- 事前インデックスされたシェイプを含むドキュメントの ID。index
- 事前インデックスされたシェイプがあるインデックスの名前。デフォルトは shapes。path
- 事前インデックスされたシェイプを含むパスとして指定されたフィールド。デフォルトは shape。routing
- 必要に応じてシェイプドキュメントのルーティング。
以下は、事前インデックスされたシェイプを使用したフィルタの例です:
Python
resp = client.indices.create(
index="shapes",
mappings={
"properties": {
"location": {
"type": "geo_shape"
}
}
},
)
print(resp)
resp1 = client.index(
index="shapes",
id="deu",
document={
"location": {
"type": "envelope",
"coordinates": [
[
13,
53
],
[
14,
52
]
]
}
},
)
print(resp1)
resp2 = client.search(
index="example",
query={
"bool": {
"filter": {
"geo_shape": {
"location": {
"indexed_shape": {
"index": "shapes",
"id": "deu",
"path": "location"
}
}
}
}
}
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'shapes',
body: {
mappings: {
properties: {
location: {
type: 'geo_shape'
}
}
}
}
)
puts response
response = client.index(
index: 'shapes',
id: 'deu',
body: {
location: {
type: 'envelope',
coordinates: [
[
13,
53
],
[
14,
52
]
]
}
}
)
puts response
response = client.search(
index: 'example',
body: {
query: {
bool: {
filter: {
geo_shape: {
location: {
indexed_shape: {
index: 'shapes',
id: 'deu',
path: 'location'
}
}
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "shapes",
mappings: {
properties: {
location: {
type: "geo_shape",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "shapes",
id: "deu",
document: {
location: {
type: "envelope",
coordinates: [
[13, 53],
[14, 52],
],
},
},
});
console.log(response1);
const response2 = await client.search({
index: "example",
query: {
bool: {
filter: {
geo_shape: {
location: {
indexed_shape: {
index: "shapes",
id: "deu",
path: "location",
},
},
},
},
},
},
});
console.log(response2);
コンソール
PUT /shapes
{
"mappings": {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
}
PUT /shapes/_doc/deu
{
"location": {
"type": "envelope",
"coordinates" : [[13.0, 53.0], [14.0, 52.0]]
}
}
GET /example/_search
{
"query": {
"bool": {
"filter": {
"geo_shape": {
"location": {
"indexed_shape": {
"index": "shapes",
"id": "deu",
"path": "location"
}
}
}
}
}
}
}
空間関係
以下は、ジオフィールドを検索する際に利用可能な空間関係演算子の完全なリストです:
INTERSECTS
- (デフォルト) クエリジオメトリと交差するgeo_shape
またはgeo_point
フィールドを持つすべてのドキュメントを返します。DISJOINT
- クエリジオメトリと共通点がないgeo_shape
またはgeo_point
フィールドを持つすべてのドキュメントを返します。WITHIN
- クエリジオメトリの内部にあるgeo_shape
またはgeo_point
フィールドを持つすべてのドキュメントを返します。ラインジオメトリはサポートされていません。CONTAINS
- クエリジオメトリを含むgeo_shape
またはgeo_point
フィールドを持つすべてのドキュメントを返します。
マッピングされていないフィールドを無視
true
に設定されている場合、ignore_unmapped
オプションはマッピングされていないフィールドを無視し、このクエリに対してドキュメントと一致しません。これは、異なるマッピングを持つ複数のインデックスをクエリする際に便利です。false
に設定されている場合(デフォルト値)、フィールドがマッピングされていない場合、クエリは例外をスローします。
ノート
- データが
geo_shape
フィールドにシェイプの配列としてインデックスされると、配列は1つのシェイプとして扱われます。このため、以下のリクエストは同等です。
Python
resp = client.index(
index="test",
id="1",
document={
"location": [
{
"coordinates": [
46.25,
20.14
],
"type": "point"
},
{
"coordinates": [
47.49,
19.04
],
"type": "point"
}
]
},
)
print(resp)
Ruby
response = client.index(
index: 'test',
id: 1,
body: {
location: [
{
coordinates: [
46.25,
20.14
],
type: 'point'
},
{
coordinates: [
47.49,
19.04
],
type: 'point'
}
]
}
)
puts response
Js
const response = await client.index({
index: "test",
id: 1,
document: {
location: [
{
coordinates: [46.25, 20.14],
type: "point",
},
{
coordinates: [47.49, 19.04],
type: "point",
},
],
},
});
console.log(response);
コンソール
PUT /test/_doc/1
{
"location": [
{
"coordinates": [46.25,20.14],
"type": "point"
},
{
"coordinates": [47.49,19.04],
"type": "point"
}
]
}
Python
resp = client.index(
index="test",
id="1",
document={
"location": {
"coordinates": [
[
46.25,
20.14
],
[
47.49,
19.04
]
],
"type": "multipoint"
}
},
)
print(resp)
Ruby
response = client.index(
index: 'test',
id: 1,
body: {
location: {
coordinates: [
[
46.25,
20.14
],
[
47.49,
19.04
]
],
type: 'multipoint'
}
}
)
puts response
Js
const response = await client.index({
index: "test",
id: 1,
document: {
location: {
coordinates: [
[46.25, 20.14],
[47.49, 19.04],
],
type: "multipoint",
},
},
});
console.log(response);
コンソール
PUT /test/_doc/1
{
"location":
{
"coordinates": [[46.25,20.14],[47.49,19.04]],
"type": "multipoint"
}
}
geo_shape
クエリは、geo_shape
フィールドがRIGHT
(反時計回り) のデフォルトorientation
を使用すると仮定します。ポリゴンの向きを参照してください。