ひげぶろぐ

開発とか組織とかの話

AWS AmplifyでElasticSearchを使う

公式ドキュメントで言うとこの辺の話。
https://aws-amplify.github.io/docs/cli/graphql#searchable

めちゃくちゃ簡単に出来る。
今回は日本語名と英語名を持つUserテーブル@DynamoDB に対し、「田中」でも「tanaka」でも検索出来るOR検索を作ってみる。

schema.graphql

@searchable をつけるだけ。

type User
  @model
  @searchable {
  id: ID!
  nameJp: String!
  nameEn: String!
}

保存したら amplify push する。
queries.js に searchUsers が追加されているのを確認できる。

バックエンドの構成としては DyanamoDBのデータ更新をトリガーにLambdaが起動してElasticsearchにデータが入る形。
AWS ConsoleでもLambda Functionが作られているのが確認出来るはず。
インデックスが更新されない等の問題が発生した場合はLambdaのエラーログを追うと原因が分かることがあるので、この辺の構成も頭に入れておくと良い。

javascript

filterで orand を使うことで複数条件のフィルタリング指定が可能。
日本語は細かく分割されて保存される関係で wildcard だと上手く一致してくれないので、 match も指定。

import * as Query from "./graphql/queries";

searchUsers = async (searchText) => {
  try {
    const ret = await API.graphql(
      graphqlOperation(Query.searchUsers, {
        filter: {
          or: [
            { nameJp: { wildcard: "*" + searchText + "*" } },
            { nameJp: { match: searchText} },
            { nameEn: { wildcard: "*" + searchText + "*" } }
          ]
        }
      })
    );
    console.log(ret.data.searchUsers.items);
    return;
  } catch (e) {
    console.error(e);
  }
};

これで上手くいくと思います。