【全文検索は?】firebase(firestore)の検索機能/elasticsearchやalgoliaもちょい調査した

おすすめのオンラインプログラミング学習

firebaseの検索に関する覚書です。

elasticsearchやalgoliaについてもちょっと調べてみました。

firestoreの検索(vuexの場合)

vuexの場合。クエリー検索する場合は検索条件をしてあげましょう。

const userRef = firebase.firestore().collection('users')

export const actions = {
  users({ commit }) {
    userRef
      .orderBy('names', 'desc')
      .get()
      .then((snap) => {
        console.log('snap')
      })
      .catch((error) => {
        console.log(error)
      })
  }
}

orderByの前後にいろいろと条件を追加すればいいだけですね。

.where('location', 'array-contains-any', ['東京', '神奈川'])
.orderBy('location', 'desc')

左のlocationがfirebaseのデータ、右が検索条件です。東京と神奈川県の人がヒットするわけです。実際は入力した値を渡してあげます。

array-contains-anyはいずれかorです。

他にもstartAtなどいろいろとあるため条件を追加しましょう。

注意点はぐぐるとき、firebaseでぐぐると、firestoreもRTDBも両方のコードがひっかります。しかし、コードの書き方が違います。RTDBのコードは書き方が違うため、そのまま使えません。置き換え作業が必要です.

RTDBのコードのサンプル。

firebase
  .database()
  .ref(`${ref}`)
  .orderByChild('name')
  .limitToLast(50)
  .startAt(payload.keyword)
  .endAt(payload.keyword + '\uF8FF')
  .then((snapShot) => {
})
スポンサーリンク

firebaseの全文検索はなし、検索機能は中途半端で使えない!?

検索エンジンのGoogleが買収したんだから、なんとかしてほしいところですかね…。

検索機能の制限事項がきついけど、解決方法は?

このぐらいならできます。

Vue.js + Vuexでストアの絞り込み検索(フィルター)
LaravelでSPA(タスク管理アプリ)作る日記5回目です。今回はVuexのStateに対して絞り込み検索を実装します。

範囲指定を複数置く場合、問題が生じるようです。。範囲での絞り込みは1つのフィールドでしか無理なようです。別の言い方をすると、複数のarray-contains(似たようなものも同様)が使えません。複数選択を複数組み合わせることができません。UI側が単一選択のセレクトボックスであっても、firebase側のデータがarrayが2つはダメです。次のようなエラーがでて苦しめられます。。

Uncaught FirebaseError: Invalid query. You cannot use more than one 'array-contains' filter.
Uncaught FirebaseError: Invalid query. You cannot use more than one 'in' filter.

その他細かいルールがあり、かなり厳しいです。

Cloud Firestore は、論理 OR クエリを制限付きでサポートしています。in と array-contains-any 演算子は、フィールドが 1 つの等値(==)条件または array-contains 条件を最大 10 個まで含む論理 OR をサポートしています。それ以外の場合は、OR 条件ごとに個別にクエリを作成し、クエリの結果をアプリで結合します。
複合クエリにおいて、範囲(<、<=、>、>=)と不等値(!=、not-in)の比較は、すべて同一のフィールドに対するフィルタである必要があります。
1 つのクエリで使用できる array-contains 句は 1 つだけです。array-contains と array-contains-any を組み合わせることはできません。
1 つのクエリでは in、not-in、array-contains-any のいずれかの句を 1 回だけ使用できます。同じクエリ内で in、not-in、array-contains-any を組み合わせることはできません。
等値(==)または in 句に含まれるフィールドでクエリを並べ替えることはできません。
クエリ内のフィルタ、並べ替え順指定、親ドキュメント パス(サブコレクションの場合は 1、ルート コレクションの場合は 0)の数の合計は、100 を超えることはできません。

Cloud Firestore で単純なクエリと複合クエリを実行する  |  Firebase Documentation

試したところ、検索についてはあまりいい印象がありませんね。。

なんちゃて検索しか使えないから、、つまるところ、firebaseに公式サイトにもありますが、algoliaかelasticsearchかを使ってくださいということですかね。。

firebaseに加え、algoliaもelasticsearchも有料なので個人開発者を悩ませそうですね。。

ちなみに、AWSの場合もこうなります。CloudSearchも有料です。

algoliaかelasticsearchを使わず、複合クエリ・複数フィールドの解決方法としては、次の記事が手掛かりになるかもしれません。

Firestore で Algolia を使わず「複数フィールド・複数カテゴリの検索」を実装する - Qiita
はじめに こちらの記事を読みました。 Firestore だけで Algolia を使わず全文検索 非常に面白い記事で、生のFirestoreでAlgoliaを使わずに全文検索を実現する方法が紹介されています。 今回は上記...

キーワード検索もきつい

次のような方法で検索できますが、

.orderBy('description')
.startAt(payload.keyword)
.endAt(payload.keyword + '\uF8FF')

頭文字しか検索できません。長文には実用レベルではないでしょう。

firebaseは全文検索はサポートしていないけど。他の方法は?

firebaseは全文検索はサポートしていないようです。

無料で使いたい場合はどうしましょう。全文検索はオープンのサービスであればGoogleカスタム検索、ほかにはlunr.jsあたりでしょうか。

スポンサーリンク

全文検索比較、elasticsearchやalgoliaはどうなの?

有料ですがelasticsearchやalgoliaなどの選択肢があります。

Elasticはオランダの会社で株も公開されている上場企業です。githubなどで採用に加え、pairs(←彼氏彼女がいない人はすぐにはじめられます。)などマッチングアプリやショッピングサイトでの採用実績があるようです。

algoliaはフランス発のサービスで、現在はアメリカのサンフランシスコに本社があります。爆速のようです。

少し調べたところ、algoliaの方が評判がよさそうなのですが、料金はElasticsearchなのですかね。。

Elasticsearchの評判です。

他にも海外から情報をとったところelasticsearchの方が安いと書かれたものがありました。

難しいところです。普段ならいいものをとりたいですが、ただ、サブスプリクションなので料金をとりますかね。。

なお、elasticsearchはクロスドメインやインデックス頻度により料金が変更されるため、個人では敷居が高いかもしれません。algoliaもmultiple domainsはライセンスが分けられているようです。non-commercial use(非商用利用)に限り無料枠があるようです。商用利用の場合は有料プランでないと使えません。

elasticsearchはudemyで日本語講座がでています。英語講座は、Complete Guide to Elasticsearchが人気でした。algoliaは英語講座だけのようです。algoliaの情報も困らない程度にはありそうですが、elasticsearchの方が情報量が多いため、学習コスト的にはelasticsearchの方がやや楽かもしれません。

udemyのオススメ講座はこちらにまとめました。

参考になれば幸いです。

コメント

タイトルとURLをコピーしました