1.


はじめに


2地域データタイプ

動的マッピングは、ジオタイプのマッピングを設定している間は機能しません。

  1. ジオポイント

  2. ジオシェイプ


2.1. ジオポイントデータ型

**

**

**

**

PUT/index__name
{
    "mappings": {
        "TYPE__NAME": {
            "properties": {
                "location": {
                    "type": "geo__point"
                }
            }
        }
    }
}

====

2.2. ジオシェイプデータ型

PUT/index__name
{
    "mappings": {
        "TYPE__NAME": {
            "properties": {
                "location": {
                    "type": "geo__shape",
                    "tree": "quadtree",
                    "precision": "1m"
                }
            }
        }
    }
}

===

3ジオポイントデータを保存するさまざまな方法

====

3.1. 緯度経度オブジェクト

PUT index__name/index__type/1
{
    "location": {
        "lat": 23.02,
        "lon": 72.57
    }
}


3.2. 緯度経度ペア

{
    "location": "23.02,72.57"
}

====

3.3. ジオハッシュ

{
    "location": "tsj4bys"
}

上記の例に示すように、ジオポイントデータをジオハッシュの形式で提供することもできます。

オンラインツール

を使用して緯度経度をジオハッシュに変換できます。

====

3.4. 経度緯度配列

{
    "location":[72.57, 23.02]}

===

4地理形状データを保存するさまざまな方法

====

4.1.

ポイント

POST/index/type
{
    "location" : {
        "type" : "point",
        "coordinates" :[72.57, 23.02]    }
}

ここで、挿入しようとしているジオシェイプタイプは

point

です。


location

フィールドを見てください。フィールド

type



coordinates

からなるオブジェクトをネストしました。これらのメタフィールドは、Elasticsaerchが地理形状とその実際のデータを識別するのに役立ちます。

====

4.2.

LineString

POST/index/type
{
    "location" : {
        "type" : "linestring",
        "coordinates" :[[77.57, 23.02],[77.59, 23.05]]    }
}

ここでは、

linestring

という地理図形を挿入しています。

linestring

の座標は、始点と終点の2点で構成されています。


LineString

ジオ形状はナビゲーションのユースケースに非常に役立ちます。

====

4.3.

ポリゴン

POST/index/type
{
    "location" : {
        "type" : "polygon",
        "coordinates" :[           [[10.0, 0.0],[11.0, 0.0],[11.0, 1.0],[10.0, 1.0],[10.0, 0.0]]       ]    }
}

ここでは、

polygon

geo形状を挿入しています。上記の例の

座標

を見てください。多角形の

最初



最後

の座標は常に、すなわち閉じた多角形と一致するはずです。

  • Elasticsearchは他のGeoJSON構造もサポートします。サポートされている他のフォーマットの完全なリストは以下の通りです:**



  • マルチポイント



  • MultiLineString



  • マルチポリゴン



  • GeometryCollection



  • 封筒



  • サークル

上記でサポートされている形式の例は、公式のhttps://www.elastic.co/guide/en/elasticsearch/reference/current/geo-shape.html#input-structure[ESサイト]にあります。

すべての構造体について、内側の

type



coordinates

は必須フィールドです。また、地理的形状フィールドのソートと取得は、その構造が複雑なため、Elasticsearchでは現在不可能です。したがって、ジオフィールドを取得する唯一の方法はソースフィールドからです。

===

5 ElasticSearch地域クエリ

これで、地理図形を含むドキュメントを挿入する方法がわかったので、地理図形クエリを使用してこれらのレコードを取得する方法について説明します。ただし、Geo Queriesの使用を開始する前に、Geo Queries用のJava APIをサポートするためには、次のような依存関係が必要です。

<dependency>
    <groupId>org.locationtech.spatial4j</groupId>
    <artifactId>spatial4j</artifactId>
    <version>0.7</version>
</dependency>
</dependency>
    <groupId>com.vividsolutions</groupId>
    <artifactId>jts</artifactId>
    <version>1.13</version>
    <exclusions>
        <exclusion>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
        </exclusion>
    </exclusions>
</dependency>

上記の依存関係をhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22org.locationtech.spatial4j%22%20AND%20a%3A%22spatial4j%22[Maven Centralで検索できますリポジトリ]も。

Elasticsearchはさまざまなタイプの地理クエリをサポートしています。それらは次のとおりです。

====

5.1. ジオシェイプクエリ

これには

geo

shape__マッピングが必要です。


geo

shape

typeと同様に、

geo

shape

はGeoJSON構造を使用して文書を照会します。

以下は、左上と右下の座標が指定された状態ですべてのドキュメントを取得するためのサンプルクエリです。

{
    "query":{
        "bool": {
            "must": {
                "match__all": {}
            },
            "filter": {
                "geo__shape": {
                    "region": {
                        "shape": {
                            "type": "envelope",
                            "coordinates" :[[75.00, 25.0],[80.1, 30.2]]                        },
                        "relation": "within"
                    }
                }
            }
        }
    }
}

ここで、

relation

は検索時に使用される

空間関係演算子

を決定します。

以下はサポートされている演算子のリストです。



  • INTERSECTS


    – (デフォルト)

    geo

    shape__を持つすべての文書を返します

フィールドがクエリジオメトリと交差する



DISJOINT

** –

geo

shape__フィールドが持つすべての文書を取得します

クエリジオメトリと共通点はない



WITHIN

** –

geo

shape__フィールドがに含まれるすべての文書を取得します。

クエリジオメトリ



CONTAINS

** –

geo

shape__フィールドに含まれるすべての文書を返します

クエリジオメトリ

同様に、異なるGeoJSON図形を使って問い合わせることができます。

上記のクエリのJavaコードは次のとおりです。

QueryBuilders
  .geoShapeQuery("region", ShapeBuilders.newEnvelope(
    new Coordinate(75.00, 25.0),
    new Coordinate(80.1, 30.2)))
  .relation(ShapeRelation.WITHIN);

====

5.2. 地域境界ボックスクエリ

Geo Bounding Boxクエリは、ポイントの位置に基づいてすべてのドキュメントを取得するために使用されます。以下はバウンディングボックスのクエリの例です。

{
    "query": {
        "bool" : {
            "must" : {
                "match__all" : {}
            },
            "filter" : {
                "geo__bounding__box" : {
                    "location" : {
                        "bottom__left" :[28.3, 30.5],
                        "top__right" :[31.8, 32.12]                    }
                }
            }
        }
    }
}

上記のバウンディングボックスクエリのJavaコードは次のとおりです。

QueryBuilders
  .geoBoundingBoxQuery("location").setCorners(31.8, 30.5, 28.3, 32.12);

Geo Bounding Boxクエリは、

geo

point

データ型の場合と同様の形式をサポートしています。サポートされている形式のサンプルクエリはhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-bounding-box-query.html#

accepted__formats[公式サイト]にあります。

====

5.3. 地理距離クエリ

地理的距離クエリは、指定された範囲のポイントに含まれるすべてのドキュメントをフィルタ処理するために使用されます。

これが

geo

distance__クエリのサンプルです。

{
    "query": {
        "bool" : {
            "must" : {
                "match__all" : {}
            },
            "filter" : {
                "geo__distance" : {
                    "distance" : "10miles",
                    "location" :[31.131,29.976]                }
            }
        }
    }
}

そして、上記のクエリのJavaコードは次のとおりです。

QueryBuilders
  .geoDistanceQuery("location")
  .point(29.976, 31.131)
  .distance(10, DistanceUnit.MILES);


geo

pointと同様に、

geo distance queryも場所座標を渡すための複数のフォーマットをサポートします。サポートされているフォーマットの詳細については、https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-distance-query.html#

accepted

formats

2[公式サイト]を参照してください。

====

5.4. 地域

ポリゴン

クエリ

与えられた点の多角形の範囲内にある点を持つすべてのレコードをフィルタリングするためのクエリ。

サンプルクエリを簡単に見てみましょう。

{
    "query": {
        "bool" : {
            "must" : {
                "match__all" : {}
            },
            "filter" : {
                "geo__polygon" : {
                    "location" : {
                        "points" :[                        {"lat" : 22.733, "lon" : 68.859},
                        {"lat" : 24.733, "lon" : 68.859},
                        {"lat" : 23, "lon" : 70.859}
                       ]                    }
                }
            }
        }
    }
}

そして、このクエリのJavaコードで:

List<GeoPoint> allPoints = new ArrayList<GeoPoint>();
allPoints.add(new GeoPoint(22.733, 68.859));
allPoints.add(new GeoPoint(24.733, 68.859));
allPoints.add(new GeoPoint(23, 70.859));

QueryBuilders.geoPolygonQuery("location", allPoints);

Geo Polygon Queryは、下記のフォーマットもサポートしています。

配列として** lat-long:[lon、lat]

  • 緯度 – 経度文字列:“ lat、lon”

  • ジオハッシュ

このクエリを使用するには、

geo

point__データ型が必須です。

===

6. 結論

この記事では、地理データのインデックス付けのためのさまざまなマッピングオプション、つまり

geo

point



geo

shape

について説明しました。

また、geo-dataを格納するためのさまざまな方法についても説明しました。最後に、ジオクエリと、ジオクエリを使用して結果をフィルタ処理するJava APIを観察しました。

いつものように、このコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-elasticsearch[このGitHubプロジェクトで利用可能]です。