Cloud FirestoreでLike検索する方法
はじめに言っておきますが、この記事では厳密にLike検索ができているわけではありません。あくまでLike検索っぽいことをしているだけなので、ご了承ください。
FirestoreでLike検索する方法をググってみたら、StackOverflowにあってためしてみたら本当にできたので、その方法について書きます。
実際の記事はこちら
実装方法
自分はFlutterで試したので、サンプルコードは全てDartですので、ご了承ください。
実装の一番メインになるコードは下記になります。
.orderBy("message").startAt([name]).endAt([name + '\uf8ff'])
正規表現のような感じで実装すればいいみたいです。
ここで注意しないといけないことは.orderBy(~~~)は必ずつけないとエラーになります。
自分が実際に試したコードは下記になります。よければご参考ください。
Firestore.instance.collection("group").document(widget.groupId).collection(
"message").orderBy("message").startAt([name]).endAt([name + '\uf8ff']).getDocuments().then((doc) {
print(doc);
});
原理
これでなぜLike検索ができるのは調べてみたのですが、\uf8ffは文字は Unicode 範囲内の非常に高いコードポイントだそうです。
つまり、全てのUnicodeの文字列を正規表現として検索しているようです。
なので、上で説明したコードはnameで指定した文字列から始まる文字列の検索ということになります。
例にあげると下記です。
例
name → shogo の場合
「shogo yamada」→ 検索できる
name → yamada
「shogo yamada」 → 検索できない
なので、正確にいうと、「nameから始まる文字列の検索」ということなので、厳密にはLike検索ができているわけではないです。
ちなみに、下記のコードを書いても何もデータを取得できませんでした。
Firestore.instance.collection("group").document(widget.groupId).collection(
"message").orderBy("message").startAt(['\uf8ff']).endAt([name + '\uf8ff']).getDocuments().then((doc) {
print(doc);
});
下記のような検索をしてみたかったんですが、ここも正規表現とか使えばなんとか解決できるんですかね?そこはこれから考えていきます。
select * from message A where name like '%yamada%';
なんか思いつけば、Twitterでメンションください!
投げ銭はいりません。それより無料でできる拡散をしてください!! 感想をツイートしていただけることが一番嬉しいです!!