2

Elasticsearch を使用して、スキーマレス データのインデックスを作成します。"longitude"問題は、インデックスを作成するエントリの大部分に"latitude"、、、"lat"またはのようなフィールドが含まれていることです"long"

フィールドタイプが地理的距離フィルターで検索できるように、そのデータにインデックスを付ける最良の方法は何ですか?

どうもありがとう。

4

1 に答える 1

5

あなたがこれを投稿してからしばらく経っていることは知っていますが、誰かが私のようにつまずいた場合に備えて、いくつかの方法があります.

私たちの場合、動的な半径が必要だったので、ここにマッピングがあります:

"mappings": {
    "mygeopoints": {
        "properties": {
            "geopoint": {
                "type": "geo_point",
                "lat_lon" : true
            },
            "radius": {
                "type": "long"
            }
        }
    }
}

ドキュメントは、次のような SQL クエリを使用してインデックス付けされます。

SELECT label, (lat || ',' || lon) as geopoint, radius FROM points;

コンマで区切られた緯度と経度の両方を含む文字列としてジオポイントを送信しています。

ポイントを検索するには、geo_distance フィルターを使用できます。

"filter" : {
    "geo_distance" : {
        "geopoint" : [ 5.7, 43.5 ],
        "distance" : "15km"
    }
}

ただし、私たちの側では、ダイナミック レンジが必要だったため、スクリプト フィルターを使用する以外の解決策は見つかりませんでした。

"filter" : {
    "script" : {
        "script" : "!doc['geopoint'].empty && doc['geopoint'].distanceInKm(43.5,5.7) <= doc['radius'].value"
    }
}
于 2013-07-22T15:08:20.437 に答える