Go Location検索をAWSアンプで加える方法と弾力的な検索
29107 ワード
FlashSearchは、また、地理空間データを含むように発生するパラメータのすべての種類に基づいて柔軟な検索を可能にする強力なツールです.
それはちょうどAWSの増幅はいくつかのコマンドを使用して弾性検索をサポートし、微調整の少しでは、我々は地理的な位置を統合するCloudFormationを変更することができます.
私はあなたがどのようにAppSyncを介して増幅とGraphSQL APIを使用してGeoSearchのエラスティックサーチを設定する方法をスローします.
ここで何が起こるかは、あなたのElluticSearchインスタンスのためのリソースを作成します.そして、あなたのDynamoSearch Streamからデータを処理して、データを弾性検索に挿入します.
あなたがDynamoDBストリームに慣れていない場合は、レコードが作成され、更新または削除時に発生する通知\/コールバックです.これらのストリームはラムダを含む複数のAWSサービスを引き起こすことができます
Python関数について好奇心が強いならば、エラスティックサーチでデータを挿入するために、ここでファイルを解凍してください.
AWSのエラスティックサーチコンソールに移動し、アクセスポリシーを変更
これは誰にでも完全なアクセスを与えます、そして、これは開発プロセスでだけ使用されるべきです.このプロジェクトのために、私は後でこれらの許可をCointtoとIAMから私のauth/unauth役割に向けます.
アフター
エラスティックサーチの座標によって探索するために、我々のDBからどの分野がどのように考えられるかを具体的に説明しなければならない
あなたがKibanaコンソールから直接含む我々のAntiticSearchインデックスにこのマッピングを加えることができる2、3の方法があります.Kibanaに直接マッピングを追加する問題は、展開後に上書きすることができ、手動で追加することを強制することです
私がその点をするのを忘れる100 %のチャンスが、あります😳
代わりに、ポスト展開ラムダを追加します
リソースブロックに次を追加します.gist here
gist内でインラインPython関数が
今私たちの新しいラムダ関数を展開する時間です
ステップ1で@検索可能なディレクティブを追加すると、キーワード検索値や計算やその他の検索の組み合わせに対して素晴らしい検索クエリを作成します.これは、GPSによって検索するためのロジックを持っていないので、我々は
あなたが注意深く見たならば、あなたは私が使用するのを見ます
次に、findestablishmentsのリゾルバテンプレートを作成する必要があります.ファイルを作成する
エラスティックサーチに接続されているfindestablishmentsというクエリがあるので、テストしましょう.第一に、我々はGPSデータを使用して設立を作成する必要があります.
それは右、我々は自分自身を取得しているAWSを増幅し、弾力性の仕事y ';all、自分自身を背中にパットを与える場所の検索を得た!
あなたがこのチュートリアルを楽しんで、より多くの拡大して、無制限の内容のために
それはちょうど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、自分自身を背中にパットを与える場所の検索を得た!
あなたがこのチュートリアルを楽しんで、より多くの拡大して、無制限の内容のために
Reference
この問題について(Go Location検索をAWSアンプで加える方法と弾力的な検索), 我々は、より多くの情報をここで見つけました https://dev.to/aws-builders/how-to-add-geo-location-search-with-aws-amplify-and-elasticsearch-22e7テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol