形状クエリ
[`````shape````` マッピング](/read/elasticsearch-8-15/aca64c6af64f60cb.md)が必要です。
クエリは、ターゲット形状を定義するための2つの方法をサポートしています。全体の形状定義を提供するか、別のインデックスに事前インデックスされた形状の名前またはIDを参照することができます。両方の形式は、以下に例とともに定義されています。
## インライン形状定義
`````geo_shape`````クエリに似て、`````shape`````クエリは[GeoJSON](http://geojson.org)または[Well Known Text](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) (WKT)を使用して形状を表現します。
次のインデックスを考えてみましょう:
#### Python
``````python
resp = client.indices.create(
index="example",
mappings={
"properties": {
"geometry": {
"type": "shape"
}
}
},
)
print(resp)
resp1 = client.index(
index="example",
id="1",
refresh="wait_for",
document={
"name": "Lucky Landing",
"geometry": {
"type": "point",
"coordinates": [
1355.400544,
5255.530286
]
}
},
)
print(resp1)
`
Ruby
response = client.indices.create(
index: 'example',
body: {
mappings: {
properties: {
geometry: {
type: 'shape'
}
}
}
}
)
puts response
response = client.index(
index: 'example',
id: 1,
refresh: 'wait_for',
body: {
name: 'Lucky Landing',
geometry: {
type: 'point',
coordinates: [
1355.400544,
5255.530286
]
}
}
)
puts response
Js
const response = await client.indices.create({
index: "example",
mappings: {
properties: {
geometry: {
type: "shape",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "example",
id: 1,
refresh: "wait_for",
document: {
name: "Lucky Landing",
geometry: {
type: "point",
coordinates: [1355.400544, 5255.530286],
},
},
});
console.log(response1);
コンソール
PUT /example
{
"mappings": {
"properties": {
"geometry": {
"type": "shape"
}
}
}
}
PUT /example/_doc/1?refresh=wait_for
{
"name": "Lucky Landing",
"geometry": {
"type": "point",
"coordinates": [ 1355.400544, 5255.530286 ]
}
}
次のクエリは、Elasticsearchのenvelope
GeoJSON拡張を使用してポイントを見つけます:
Python
resp = client.search(
index="example",
query={
"shape": {
"geometry": {
"shape": {
"type": "envelope",
"coordinates": [
[
1355,
5355
],
[
1400,
5200
]
]
},
"relation": "within"
}
}
},
)
print(resp)
Js
const response = await client.search({
index: "example",
query: {
shape: {
geometry: {
shape: {
type: "envelope",
coordinates: [
[1355, 5355],
[1400, 5200],
],
},
relation: "within",
},
},
},
});
console.log(response);
コンソール
GET /example/_search
{
"query": {
"shape": {
"geometry": {
"shape": {
"type": "envelope",
"coordinates": [ [ 1355.0, 5355.0 ], [ 1400.0, 5200.0 ] ]
},
"relation": "within"
}
}
}
}
事前インデックスされた形状
クエリは、別のインデックスにすでにインデックスされた形状を使用することもサポートしています。これは、アプリケーションに役立つ事前定義された形状のリストがあり、毎回座標を提供するのではなく論理名(例えばニュージーランド)を使用して参照したい場合に特に便利です。この場合、提供する必要があるのは次のものだけです:
id
- 事前インデックスされた形状を含むドキュメントのID。index
- 事前インデックスされた形状があるインデックスの名前。デフォルトはshapesです。path
- 事前インデックスされた形状を含むパスとして指定されたフィールド。デフォルトはshapeです。routing
- 必要に応じて形状ドキュメントのルーティング。
以下は、事前インデックスされた形状を使用したフィルターの例です:
Python
resp = client.indices.create(
index="shapes",
mappings={
"properties": {
"geometry": {
"type": "shape"
}
}
},
)
print(resp)
resp1 = client.index(
index="shapes",
id="footprint",
document={
"geometry": {
"type": "envelope",
"coordinates": [
[
1355,
5355
],
[
1400,
5200
]
]
}
},
)
print(resp1)
resp2 = client.search(
index="example",
query={
"shape": {
"geometry": {
"indexed_shape": {
"index": "shapes",
"id": "footprint",
"path": "geometry"
}
}
}
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'shapes',
body: {
mappings: {
properties: {
geometry: {
type: 'shape'
}
}
}
}
)
puts response
response = client.index(
index: 'shapes',
id: 'footprint',
body: {
geometry: {
type: 'envelope',
coordinates: [
[
1355,
5355
],
[
1400,
5200
]
]
}
}
)
puts response
response = client.search(
index: 'example',
body: {
query: {
shape: {
geometry: {
indexed_shape: {
index: 'shapes',
id: 'footprint',
path: 'geometry'
}
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "shapes",
mappings: {
properties: {
geometry: {
type: "shape",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "shapes",
id: "footprint",
document: {
geometry: {
type: "envelope",
coordinates: [
[1355, 5355],
[1400, 5200],
],
},
},
});
console.log(response1);
const response2 = await client.search({
index: "example",
query: {
shape: {
geometry: {
indexed_shape: {
index: "shapes",
id: "footprint",
path: "geometry",
},
},
},
},
});
console.log(response2);
コンソール
PUT /shapes
{
"mappings": {
"properties": {
"geometry": {
"type": "shape"
}
}
}
}
PUT /shapes/_doc/footprint
{
"geometry": {
"type": "envelope",
"coordinates": [ [ 1355.0, 5355.0 ], [ 1400.0, 5200.0 ] ]
}
}
GET /example/_search
{
"query": {
"shape": {
"geometry": {
"indexed_shape": {
"index": "shapes",
"id": "footprint",
"path": "geometry"
}
}
}
}
}
空間関係
以下は利用可能な空間関係演算子の完全なリストです:
INTERSECTS
- (デフォルト) クエリジオメトリと交差するshape
フィールドを持つすべてのドキュメントを返します。DISJOINT
- クエリジオメトリと共通点がないshape
フィールドを持つすべてのドキュメントを返します。WITHIN
- クエリジオメトリ内にあるshape
フィールドを持つすべてのドキュメントを返します。CONTAINS
- クエリジオメトリを含むshape
フィールドを持つすべてのドキュメントを返します。
未マップを無視
true
に設定されている場合、ignore_unmapped
オプションは未マップフィールドを無視し、このクエリに対してドキュメントと一致しません。これは、異なるマッピングを持つ複数のインデックスをクエリする際に便利です。false
(デフォルト値)に設定されている場合、フィールドがマップされていないとクエリは例外をスローします。