Go Location検索をAWSアンプで加える方法と弾力的な検索


FlashSearchは、また、地理空間データを含むように発生するパラメータのすべての種類に基づいて柔軟な検索を可能にする強力なツールです.
それはちょうどAWSの増幅はいくつかのコマンドを使用して弾性検索をサポートし、微調整の少しでは、我々は地理的な位置を統合するCloudFormationを変更することができます.
私はあなたがどのようにAppSyncを介して増幅とGraphSQL APIを使用してGeoSearchのエラスティックサーチを設定する方法をスローします.
This tutorial assumes you have some familiarity with Amplify and have already initiated a project

ステップ1


設定タイプwを追加します


type Establishment @searchable {
  gps: GPS
}

type GPS {
  lon: Float
  lat:  Float
}
その後、端末
$: amplify api push
(これは通常、エラスティックサーチインスタンスの展開を待っているので、15 - 20分程度かかります).
ここで何が起こるかは、あなたのElluticSearchインスタンスのためのリソースを作成します.そして、あなたのDynamoSearch Streamからデータを処理して、データを弾性検索に挿入します.
あなたがDynamoDBストリームに慣れていない場合は、レコードが作成され、更新または削除時に発生する通知\/コールバックです.これらのストリームはラムダを含む複数のAWSサービスを引き起こすことができます
Python関数について好奇心が強いならば、エラスティックサーチでデータを挿入するために、ここでファイルを解凍してください.amplify/api/your-api-name/build/functions/ElasticSearchStreamingLambdaFunction.zip

ステップ2


エラスティックサーチ/キバナの更新アクセスポリシー


AWSのエラスティックサーチコンソールに移動し、アクセスポリシーを変更


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:<AWS-ACCOUNT-ID>:domain/amplify-elasti-fw023i2ikk3/*"
    }
  ]
}

🚨 警告🚨


これは誰にでも完全なアクセスを与えます、そして、これは開発プロセスでだけ使用されるべきです.このプロジェクトのために、私は後でこれらの許可をCointtoとIAMから私のauth/unauth役割に向けます.
アフター
 {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AWS-ACCOUNT-ID>:role/amplify-restaurantreviewapp-dev-000000-authRole"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:<AWS-ACCOUNT-ID>:domain/amplify-elasti-w023i2ikk3/*"
    }

ステップ3


ジオ座標用のエラスティックサーチマッピングを作成する


エラスティックサーチの座標によって探索するために、我々のDBからどの分野がどのように考えられるかを具体的に説明しなければならないgeo_point , LAT , Lionによって問い合わせられるようにインデックスをつけることができます.
あなたがKibanaコンソールから直接含む我々のAntiticSearchインデックスにこのマッピングを加えることができる2、3の方法があります.Kibanaに直接マッピングを追加する問題は、展開後に上書きすることができ、手動で追加することを強制することですgeo_point それぞれの新しいビルドの後.
私がその点をするのを忘れる100 %のチャンスが、あります😳
代わりに、ポスト展開ラムダを追加しますamplify/backend/api/your-api-name/stacks/CustomResources.json .
リソースブロックに次を追加します.gist here
gist内でインラインPython関数がConfigureES . ここで重要なのは、
action = {\"mappings\": {\"doc\": {\"properties\": {\"gps\": {\"type\": \"geo_point\"}}}}}"
これはDynamodbからフィールドのマッピングを作成しますgps それはgeo_point Lat , Lon型の値.
今私たちの新しいラムダ関数を展開する時間です
$: amplify api push

Before we go any further, I have to give a lot of credit to
and his commentor in this . Ross's comment in this article was the inspiration and base for the code I shared in the gist, so thanks to the both of you 🙏🏻


ステップ4


クエリfinfinabishmentsを作成し、VTLテンプレートと一緒にCustomResourcesでエラスティックサーチデータソースを添付します


ステップ1で@検索可能なディレクティブを追加すると、キーワード検索値や計算やその他の検索の組み合わせに対して素晴らしい検索クエリを作成します.これは、GPSによって検索するためのロジックを持っていないので、我々はfindEstablishmentsスキーマに追加します.グラフ
type Query {
  findEstablishments(
    input: FindEstablishmentsInput!
  ): SearchableEstablishmentConnection @aws_iam @aws_cognito_user_pools
}

type GPS {
  lon: Float
  lat: Float
}

input GPSInput {
  lon: Float!
  lat: Float!
}

input GPSQueryInput {
  gps: GPSInput!
  radius: Float!
}

input FindEstablishmentsInput {
  byGPS: GPSQueryInput
  byPlaceID: String
  limit: Int
  nextToken: String
  from: Int
}

type SearchableEstablishmentConnection @aws_iam @aws_cognito_user_pools {
  items: [Establishment]
  nextToken: String
  total: Int
}
次に、我々は我々のところに戻る必要がありますCustomResources.json とエラスティックサーチに接続されているfindestablishmentsのリゾルバを追加する
"FindEstablishmentsResolver": {
      "Type": "AWS::AppSync::Resolver",
      "Properties": {
        "ApiId": {
          "Ref": "AppSyncApiId"
        },
        "DataSourceName": "ElasticSearchDomain",
        "FieldName": "findEstablishments",
        "TypeName": "Query",
        "RequestMappingTemplateS3Location": {
          "Fn::Sub": [
            "s3://${S3DeploymentBucket}/${S3DeploymentRootKey}/resolvers/${ResolverFileName}",
            {
              "S3DeploymentBucket": {
                "Ref": "S3DeploymentBucket"
              },
              "S3DeploymentRootKey": {
                "Ref": "S3DeploymentRootKey"
              },
              "ResolverFileName": {
                "Fn::Join": [".", ["Query", "findEstablishments", "req", "vtl"]]
              }
            }
          ]
        },
        "ResponseMappingTemplateS3Location": {
          "Fn::Sub": [
            "s3://${S3DeploymentBucket}/${S3DeploymentRootKey}/resolvers/${ResolverFileName}",
            {
              "S3DeploymentBucket": {
                "Ref": "S3DeploymentBucket"
              },
              "S3DeploymentRootKey": {
                "Ref": "S3DeploymentRootKey"
              },
              "ResolverFileName": {
                "Fn::Join": [
                  ".",
                  ["Query", "searchEstablishments", "res", "vtl"]
                ]
              }
            }
          ]
        }
      }
    },
エラスティックサーチデータソース"DataSourceName": "ElasticSearchDomain" ) @検索可能なディレクティブで私たちのために作成されたので、我々はちょうど名前でそれを参照している.
あなたが注意深く見たならば、あなたは私が使用するのを見ます["Query", "searchEstablishments", "res", "vtl"] を返します.["Query", "findEstablishments", "res", "vtl"] . Amplifyは、FlasticSearchのための適切な応答テンプレートを既に生成しましたsearchEstablishments , それで、再びそれを書く代わりに、我々はSearchStatshments反応を示しています.
次に、findestablishmentsのリゾルバテンプレートを作成する必要があります.ファイルを作成するamplify/api/<your-api-name>/resolvers/Query.findEstablishments.req.vtl 次の行を追加します.
#set( $indexPath = "/establishment/doc/_search" )

#set($query = {
  "bool": {

  }
})

#set($sort = [])

#if (!$util.isNull($context.args.input.byGPS ))
  $util.qr($query.bool.put("must", {"match_all" : {}}))
  $util.qr($query.bool.put("filter", {
    "geo_distance": {
      "distance": "${context.args.input.byGPS.radius}km",
      "gps": $context.args.input.byGPS.gps
    }
  }))

  $util.qr($sort.add({
    "_geo_distance":  {
      "gps":  $context.args.input.byGPS.gps,
      "order": "asc",
      "unit": "mi", 
      "distance_type": "plane" 
    }
  }))
#end


#if (!$util.isNull($context.args.input))
  #set($from = $util.defaultIfNull($context.args.input.nextToken, 0))
  #set($size = $util.defaultIfNull($context.args.input.limit, 20))
#else
  #set($from = 0)
  #set($size = 20)
#end

{
  "version":"2017-02-28",
  "operation":"GET",
  "path":"$indexPath",
  "params":{
    "body": {
      "from": $util.toJson($from),
      "size": $util.toJson($size),
      "query": $util.toJson($query),
      "sort": $util.toJson($sort)
    }
  }
}

わかりました、押しましょう
$: amplify api push

ステップ5


検索場所


エラスティックサーチに接続されているfindestablishmentsというクエリがあるので、テストしましょう.第一に、我々はGPSデータを使用して設立を作成する必要があります.
mutation {
  createEstablishment(input:{
    id:"test-restaurant",
    name: "Test Raustaurant",
    gps:{
      lat: 41.88337459649123,
      lon: -87.69204235097645
    }
  }) {
    id
    gps {
      lat
      lon
    }
  }
}
次に、ByGPSを問い合わせる必要があります( Radius isキロメートル).
query {
  findEstablishments(input:{
        byGPS:{
        gps: {lat: 41.86260812331178, lon: -87.79148237035405},
      radius:10
    }
  }) {
    items {
      id
      gps {
        lat
        lon
      }
    }
  }
}
とDrumrollllllllしてください、最終結果:
{
  "data": {
    "findEstablishments": {
      "items": [
        {
          "id": "cc7ea996-1568-4ef7-a640-bd4136eb88f9",
          "gps": {
            "lat": 41.88337459649123,
            "lon": -87.69204235097645
          }
        }
      ]
    }
  }
}

それは右、我々は自分自身を取得しているAWSを増幅し、弾力性の仕事y ';all、自分自身を背中にパットを与える場所の検索を得た!
あなたがこのチュートリアルを楽しんで、より多くの拡大して、無制限の内容のために