地理距離クエリ
指定された距離内の地理ポイントに対して 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_distance
フィルターを使用して geo_point
の値を一致させます:
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_distance: {
distance: '200km',
'pin.location' => {
lat: 40,
lon: -70
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_distance: {
distance: "200km",
"pin.location": {
lat: 40,
lon: -70,
},
},
},
},
},
});
console.log(response);
コンソール
GET /my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
指定された距離内で geo_shape
の値を一致させるために同じフィルターを使用します:
Python
resp = client.search(
index="my_geoshapes",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_geoshapes',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_distance: {
distance: '200km',
'pin.location' => {
lat: 40,
lon: -70
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_geoshapes",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_distance: {
distance: "200km",
"pin.location": {
lat: 40,
lon: -70,
},
},
},
},
},
});
console.log(response);
コンソール
GET my_geoshapes/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
両方の geo_point
と geo_shape
の値を一致させるには、両方のインデックスを検索します:
Python
resp = client.search(
index="my_locations,my_geoshapes",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations,my_geoshapes',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_distance: {
distance: '200km',
'pin.location' => {
lat: 40,
lon: -70
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations,my_geoshapes",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_distance: {
distance: "200km",
"pin.location": {
lat: 40,
lon: -70,
},
},
},
},
},
});
console.log(response);
コンソール
GET my_locations,my_geoshapes/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
受け入れ可能なフォーマット
地理ポイントの異なる表現を geo_point
タイプが受け入れるのと同様に、フィルターも受け入れることができます:
プロパティとしての緯度経度
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "12km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_distance: {
distance: '12km',
'pin.location' => {
lat: 40,
lon: -70
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_distance: {
distance: "12km",
"pin.location": {
lat: 40,
lon: -70,
},
},
},
},
},
});
console.log(response);
コンソール
GET /my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "12km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
配列としての緯度経度
[lon, lat]
形式、ここでの経度/緯度の順序に注意して、GeoJSON に準拠します。
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "12km",
"pin.location": [
-70,
40
]
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_distance: {
distance: '12km',
'pin.location' => [
-70,
40
]
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_distance: {
distance: "12km",
"pin.location": [-70, 40],
},
},
},
},
});
console.log(response);
コンソール
GET /my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "12km",
"pin.location": [ -70, 40 ]
}
}
}
}
}
WKT文字列としての緯度経度
Well-Known Text 形式。
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "12km",
"pin.location": "POINT (-70 40)"
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_distance: {
distance: '12km',
'pin.location' => 'POINT (-70 40)'
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_distance: {
distance: "12km",
"pin.location": "POINT (-70 40)",
},
},
},
},
});
console.log(response);
コンソール
GET /my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "12km",
"pin.location": "POINT (-70 40)"
}
}
}
}
}
ジオハッシュ
Python
resp = client.search(
index="my_locations",
query={
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "12km",
"pin.location": "drm3btev3e86"
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_locations',
body: {
query: {
bool: {
must: {
match_all: {}
},
filter: {
geo_distance: {
distance: '12km',
'pin.location' => 'drm3btev3e86'
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_locations",
query: {
bool: {
must: {
match_all: {},
},
filter: {
geo_distance: {
distance: "12km",
"pin.location": "drm3btev3e86",
},
},
},
},
});
console.log(response);
コンソール
GET /my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "12km",
"pin.location": "drm3btev3e86"
}
}
}
}
}
オプション
フィルターで許可されるオプションは次のとおりです:
distance |
指定された場所を中心とした円の半径。 この円に含まれるポイントは一致と見なされます。 distance はさまざまな単位で指定できます。 距離単位 を参照してください。 |
distance_type |
距離を計算する方法。 arc (デフォルト) または plane (高速だが長距離および極近くでは不正確) のいずれかです。 |
_name |
クエリを識別するためのオプションの名前フィールド |
validation_method |
無効な緯度または経度を持つ地理ポイントを受け入れるには IGNORE_MALFORMED に設定し、正しい座標を推測しようとするには COERCE に設定します (デフォルトは STRICT です)。 |
ドキュメントごとの複数の位置
geo_distance
フィルターは、ドキュメントごとに複数の位置/ポイントで機能します。 単一の位置/ポイントがフィルターに一致すると、そのドキュメントはフィルターに含まれます。
未マップを無視
true
に設定すると、ignore_unmapped
オプションは未マップのフィールドを無視し、このクエリに対してドキュメントと一致しません。 これは、異なるマッピングを持つ可能性のある複数のインデックスをクエリする際に便利です。 false
(デフォルト値) に設定すると、フィールドがマップされていない場合、クエリは例外をスローします。