通常のクエリとフィルターは、スクリプトがそれらの中に配置されることを想定していません。
geo_point
のフィールド名で を保存したと仮定すると、doc['field_name'].distanceInMiles(lat, lon)を使用してスクリプト フィルターlocation
を使用する必要があります(標準単位がas-of であるためとは対照的に):distance(lat, lon)
meters
v1.0.0
{
"filtered" : {
"query" : { "match_all" : { } },
"filter" : {
"script" : {
"script" :
"doc['location'].distanceInMiles(lat, lon) < doc['distance'].value",
"params" : {
"lat" : 51.512497,
"lon" : -0.052098
}
}
}
}
}
miles
(pre- )の以前の標準単位を使用している Elasticsearch のインスタンスを実行している場合はv1.0.0
、プレーンdistance
関数を使用できます (または、現在の標準の as-of の単位distance
がたまたま使用されている場合)。meters
v1.0.0
{
"filtered" : {
"query" : { "match_all" : { } },
"filter" : {
"script" : {
"script" :
"doc['location'].distance(lat, lon) < doc['distance'].value",
"params" : {
"lat" : 51.512497,
"lon" : -0.052098
}
}
}
}
}
注: 1 回限りの実行のためにスクリプト内で との値を直接指定することもできますがlat
、スクリプトはコンパイルおよびキャッシュされるため、パラメーターを使用すると再利用が可能になり、初回使用後の実行が高速になります。lon
ドキュメントに記載されているように、フィルターに追加"_cache" : true
することでフィルターの結果をキャッシュできますが、フィルターの結果は既定ではキャッシュされません。