firebaseの検索に関する覚書です。
elasticsearchやalgoliaについてもちょっと調べてみました。
Contents
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などいろいろとあるため条件を追加しましょう。
RTDBのコードのサンプル。
firebase .database() .ref(`${ref}`) .orderByChild('name') .limitToLast(50) .startAt(payload.keyword) .endAt(payload.keyword + '\uF8FF') .then((snapShot) => { })
firebaseの全文検索はなし、検索機能は中途半端で使えない!?
検索エンジンのGoogleが買収したんだから、なんとかしてほしいところですかね…。
検索機能の制限事項がきついけど、解決方法は?
このぐらいならできます。
https://www.webopixel.net/javascript/1461.html
範囲指定を複数置く場合、問題が生じるようです。。範囲での絞り込みは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 を超えることはできません。
https://firebase.google.com/docs/firestore/query-data/queries?hl=ja
試したところ、検索についてはあまりいい印象がありませんね。。
なんちゃて検索しか使えないから、、つまるところ、firebaseに公式サイトにもありますが、algoliaかelasticsearchかを使ってくださいということですかね。。
firebaseに加え、algoliaもelasticsearchも有料なので個人開発者を悩ませそうですね。。
ちなみに、AWSの場合もこうなります。CloudSearchも有料です。
AWS使ってて全文検索、今だったらCloudSearchよりElasticsearch Serviceを取るなあ、きっと。簡易なものであればCloudSearchでもよいのだろうけど、運用楽だし。
— 山岡広幸 | Hiroyuki Yamaoka (@hiro_y) July 11, 2017
algoliaかelasticsearchを使わず、複合クエリ・複数フィールドの解決方法としては、次の記事が手掛かりになるかもしれません。
https://qiita.com/heavenosk/items/598397c9936bc57ed8be
キーワード検索もきつい
次のような方法で検索できますが、
.orderBy('description') .startAt(payload.keyword) .endAt(payload.keyword + '\uF8FF')
頭文字しか検索できません。長文には実用レベルではないでしょう。
firebaseは全文検索はサポートしていないけど。他の方法は?
firebaseは全文検索はサポートしていないようです。
無料で使いたい場合はどうしましょう。全文検索はオープンのサービスであればGoogleカスタム検索、ほかにはlunr.jsあたりでしょうか。
Static site with lunr.js for full text search. Customizable, fast and free 👍
— Michael Koper (@michaelkoper) January 8, 2021
Lunrの日本語対応で参考にさせて頂きました。ありがとうございました / “JSの全文検索lunrをNode.jsで使う | Simple is Beautiful.” https://t.co/OuPIs7t0Go
— progrhyme (@progrhyme) May 15, 2020
このブログは Web に発表する「文書」という意味を強調するためにこんなデザインにしたのだが、果たして謎に今っぽさを出してしまい…… / “Vue.js + lunr.js を使い hugo サイトに全文検索を追加する | tbsmcd” https://t.co/4ZT4yw9QBS
— Tsubasa Mochida (@tbsmcd) March 6, 2020
全文検索比較、elasticsearchやalgoliaはどうなの?
有料ですがelasticsearchやalgoliaなどの選択肢があります。
Elasticはオランダの会社で株も公開されている上場企業です。githubなどで採用に加え、pairs(←彼氏彼女がいない人はすぐにはじめられます。)などマッチングアプリやショッピングサイトでの採用実績があるようです。
algoliaはフランス発のサービスで、現在はアメリカのサンフランシスコに本社があります。爆速のようです。
少し調べたところ、algoliaの方が評判がよさそうなのですが、料金はElasticsearchなのですかね。。
先日全文検索用に導入しようとせっせと組み込みしていたalgoliaですが、費用の面から断念・・・
ということで、今日は似たようなサービスのElasticsearchのSearchlyをせっせと組み込んでました🐻「Elasticsearchって名前聞くけどよくわかんね😇」
だったんですが、なんとなく分かってきました😄— いくま@フリープログラマー (@hisk_of_gnct) August 27, 2020
全文検索エンジンはAlgoliaをよく使って機能的には最高なんだけど、正直料金高いのでElastic CloudとかElasticsearchに移行したい感ある。
— こんろー (@conroe215) January 18, 2020
Elasticsearchの評判です。
いえ、サイトに乗ってる金額がそのままですね。App Searchを使うのであれば、月49ドルです。その他の話はかからないです。Elastic Cloud のElasticsearch Serviceを使うのであれば、月16ドルからだけです。AWSやGCPなどのインスタンス利用料自体も含まれてます。
— Jun Ohtani (@johtani) October 1, 2019
Algolia 無料プランあるけど商用には使えない
商用で使う場合は月29ドルからhttps://t.co/XnXlULe5uAElasticSearch
月16ドルからhttps://t.co/SoUIUtn252
オンプレでも動かせてオンプレだと無料からhttps://t.co/EGqqHP8XrCということで今回はElasticSearchにしとこうかな
— Katsumi Ponda (@kponda) January 30, 2020
Algolia便利だけど、やっぱり料金の問題があり、継続は難しい。Elasticsearchを検討して調査した。ElasticsearchとKibanaは無料だけど、これらをGCEにデプロイして利用するのにお金がかかる。デプロイ周りなどマネージドしてくれるのが、Elasticsearch Serviceで最低$16でAlgoliaの$29より安い。
— ストクロ (@kurotyann9696) May 16, 2020
他にも海外から情報をとったところelasticsearchの方が安いと書かれたものがありました。
難しいところです。普段ならいいものをとりたいですが、ただ、サブスプリクションなので料金をとりますかね。。
なお、elasticsearchはクロスドメインやインデックス頻度により料金が変更されるため、個人では敷居が高いかもしれません。algoliaもmultiple domainsはライセンスが分けられているようです。non-commercial use(非商用利用)に限り無料枠があるようです。商用利用の場合は有料プランでないと使えません。
elasticsearchやalgoliaの使い方
elasticsearchやalgoliaはudemyに英語講座がたくさんでています。個人的にはComplete Guide to Elasticsearchを買いました。algoliaの情報も困らない程度にはありそうですが、elasticsearchの方が情報量が多いため、学習コスト的にはelasticsearchの方がやや楽かもしれません。
elasticsearchを含めて、udemyのオススメ講座はこちらにまとめました。
udemyのelasticsearchの英語の講座をみたり(動画なのでわかりやすい)、qittaやclassmethodのサイトをみたりで、開発の効率化をしています。
elasticsearchやalgoliaとfirebaseの連携
追記です。調べたら拡張がでていますね。
Algoliaより面倒そうなイメージあったけど、思ったよりお手軽かも( ´・?・`)
— mono (@_mono) October 15, 2021
クエリあたりの価格はAlgoliaより一桁くらい安い?( ´・?・`)https://t.co/hEf1nfE69e pic.twitter.com/a0Fml2v05W
https://firebase.google.com/products/extensions/elastic-firestore-elastic-app-search
2021年11月11日のFirebase Summit で発表されたようです。自動同期できますかね。これは楽できるかもです。
Algoliaも同じようなものがでています。
https://firebase.google.com/products/extensions/algolia-firestore-algolia-search
個人的にはElasticsearchを導入しました。
参考になれば幸いです。
コメント