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で or
や and
を使うことで複数条件のフィルタリング指定が可能。
日本語は細かく分割されて保存される関係で 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); } };
これで上手くいくと思います。