文系プログラマーが語る

主にプログラミング関連の記事を書いています。

【Flutter×Firestore×Algolia】全文検索を実装します(コピペOKのサンプルコード付き)

今回はタイトルの通り、Flutter×Firestore×Algoliaで全文検索を実装するサンプルです。

個人開発中のアプリで「全文検索(ここではSQLでいうLike句とほぼ同義)」を実装する必要があったため、今回はその備忘録も兼ねて実装手順を紹介しようと思います。

 

 

はじめに

まずはじめにですが、以下の通りFirestoreは「全文検索」をサポートしていません!!

 

そのため、「全文検索」を実装するためには「N-gram」等のアルゴリズムを用いて独自実装するか、サードパーティ製サービスを利用するかの主に二択があるかと思います。

 

今回の開発では、実装の容易性を考えて「Algolia」というサービスを利用しました。

 

全文検索とは

いったん、全文検索について軽く復習。

 

一言でいうと、ある文書内から特定の文字列が含まれるものを検索することです。

 

実装手順

①Algoliaに登録し、プロジェクトの設定をする

以下URLにアクセスして登録する。

https://dashboard.algolia.com/users/sign_in

Algoliaの設定に関してはFlutterとAlgoliaを使って全文検索をしてみた | 可茂IT塾を参考にしました!

 

②Firebase ExtensionsでSearch Firestore with Algoliaをインストールする

※Firebaseのextension機能は、Firebaseを従量制にしないと利用できません。
※以前は「Serach with Algolia」という名前でした。


③Flutterで「algolia_helper_flutter」パッケージを導入する

1.「pubspec.yaml」に追加
algolia_helper_flutter: ^0.5.0

※「algolia」パッケージではないです。

 

2.以降は実装コードの説明です。詳細は以下を参考にしてください。

https://www.algolia.com/doc/guides/building-search-ui/getting-started/flutter/

英語ばかりでしんどいという方はとりあえず2.以降に進んでみてください。重要な個所だけはしょった感じなので検索の実行はとりあえずできるようになります^^笑

 

2.HitsSearcherオブジェクトを作成

HitsSearcherとはAlgoliaの検索エンジンに接続するためのアクセス先情報の定義(オブジェクト)です。

final hitsSearcher = HitsSearcher(
    applicationID: 'YourApplicationID',
    apiKey: 'YourAPIKey',
    indexName: 'YourIndexName',
 );
  
3.クエリの実行
hitsSearcher.query(searchString);
  
4.検索結果の受け取り
await for (var response in hitsSearcher.responses.timeout(Duration(seconds: 1))) {
      final hits = response.hits.toList() ?? [];
      for (var hit in hits) {
        // 検索結果から特定のフィールドを取得し、結果リストに追加します。
        results.add(hit['YourFieldName']);
      }
    }
  
5.HitsSearcherリソースの解放
hitsSearcher.dispose();
  

 

サンプルコード全文(コピペOK)

以下にAlgolia検索用の関数サンプルを載せてるので参考にしてみてください。

// 概要:一般的な検索関数
// この関数は引数で受け取った文字列をAlgolia検索し、該当項目をリストで返します。
// 引数:入力した項目の文字
// 戻り値:Algoliaで検索した、引数の文字列に部分一致する項目のリスト
Future<List> searchWithAlgolia(String searchString) async {
  // ①. Create a Hits Searcher
  // HitsSearcherオブジェクトを作成します。これはAlgoliaの検索エンジンに接続するためのオブジェクトです。
  final hitsSearcher = HitsSearcher(
    applicationID: 'YourApplicationID',
    apiKey: 'YourAPIKey',
    indexName: 'YourIndexName',
  );

  List results = [];

  // ②. クエリを実行
  // searchStringを引数にして、Algoliaの検索エンジンにクエリを送信します。
  hitsSearcher.query(searchString);

  try {
    // ③. Listen to search responses
    // Algoliaからの検索結果を受け取ります。結果は非同期的に返されるため、await for構文を使用します。
    await for (var response in hitsSearcher.responses.timeout(Duration(seconds: 1))) {
      final hits = response.hits.toList() ?? [];
      for (var hit in hits) {
        // 検索結果から特定のフィールドを取得し、結果リストに追加します。
        results.add(hit['YourFieldName']);
      }
    }
  } on TimeoutException catch (e) {
    // ④. 検索が指定した時間内に完了しない場合、タイムアウト例外をキャッチします。
    print('The operation has timed out: $e');
  } catch (e) {
    // その他のエラーをキャッチします。
    print('An error occurred: $e');
  }

  // ⑤. Release underling resources
  // HitsSearcherオブジェクトがもはや必要ない場合、リソースを解放します。
  hitsSearcher.dispose();

  // ⑥. 検索結果のリストを返します。
  return results;
}
  

おわりに

今回は「Flutter×Firestore×Algolia」で全文検索を実装する手順とサンプル紹介でした。この記事があなたのアプリ開発に役立っていればうれしいです!

 

以上となります、最後までお読みいただきありがとうございました!