1

このようにPythonで地理距離クエリを使用しています

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "20miles",
          "location": {
            "lat": 51.512497,
            "lon": -0.052098
          }
        }
      }
    }
  }
} 

正常に動作しています。私の問題は、ドキュメント内から「距離」に値を与える方法です。各レコードのインデックスにこのようなフィールドがあり、distance: 50それを測地距離の距離の値として使用したいと考えています。試し"distance":doc['distance'].valueましたが、うまくいきません。

4

1 に答える 1

3

通常のクエリとフィルターは、スクリプトがそれらの中に配置されることを想定していません。

geo_pointのフィールド名で を保存したと仮定すると、doc['field_name'].distanceInMiles(lat, lon)を使用してスクリプト フィルターlocationを使用する必要があります(標準単位がas-of であるためとは対照的に):distance(lat, lon)metersv1.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がたまたま使用されている場合)。metersv1.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することでフィルターの結果をキャッシュできますが、フィルターの結果は既定ではキャッシュされません。

于 2014-04-12T19:35:05.457 に答える