ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

実用的な検索機能を実装するには

f:id:mbaasdevrel:20180913163950p:plain

NCMBでは検索に特化した機能は提供していません。しかしアプリの中で検索機能を提供したいと考えることもあるでしょう。そうした時にどんな形で提供できるのか、紹介したいと思います。

1. 正規表現を使う

正規表現を使うことで、前方一致や一部一致など柔軟な検索ができるようになります。なお、データストアの検索では同一条件のANDが利用できません。例えば 単語1 単語2 のようにスペースを入れた場合に、単語1単語2 の出現順番が逆になることも考えられます。単語1 または 単語2 を含むという条件であればor条件を利用できます。この場合、.*単語1.*?単語2.*.*単語2.*単語1.* という2つの正規表現を or 条件で結ぶ形になるでしょう。

2. n-gram検索を使う

n-gramというのは、文字列をn文字ずつに区切ってデータストアに入れておくという手法になります。具体的にいうと 本日は晴天なり という文字列を2-gramで分ける場合、 本日 日は は晴 晴天 天な なり という具合に2文字ずつに分解します。そして検索する際にも同様に検索キーワードを2文字ずつに分解します。

分解した文字を配列型として検索用フィールドに入れておきます。そして分割した検索キーワードがすべて含まれるレコードを抽出します。この場合は指定した文字列がすべて含まれる $all オペランドを利用します。

REST API リファレンス : クエリの指定方法 | ニフクラ mobile backend

n-gram方式の場合、データ量が格段に増えてしまうのが難点です。また、2-gramの場合、京都と検索した時に東京都まで抽出されてしまうという問題がよく知られています(東京、京都に分割されるので)。

3. 分かち書きしておく

テキストを文脈に沿って分割してくれる分かち書きを行って、フィールドに入れておく方法もあります。多くの場合、名詞だけを入れておきます。この場合も配列型に入れておき、ユーザの入力した文字列がすべて含まれるレコードを抽出します。

NCMB側に分かち書き機能はありませんので、クライアント側であらかじめ分割処理を行う必要があります。保存時に多少処理が必要になるでしょう。

4. 外部サービスを使う

Amazon CloudSearchやAlgoliaなどクラウドベースの検索サービスと組み合わせる方法です。こうした全文検索対応のサービスを使えば、より柔軟なテキスト検索が行えるようになるでしょう。

問題としては自分のデータだけ、自分のフォロワーのデータだけといった詳細条件の指定が難しいといったことでしょう。しかしWeb APIベースで検索機能を分離できれば、実装はより簡単になるはずです。この場合も保存時にデータをNCMBと検索サービスの両方に送信する必要があります。

まとめ

簡易的な検索であれば正規表現でも十分ですが、データ量が増えてきてユーザがより正確に自分のデータを取り出したり、検索を行いたいとなってきたら、別な方法を考える必要があるでしょう。大量のデータからインデックスを作るのは時間がかかりますので、予め想定しておくと対応も早くできるかと思います。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。