見出し画像

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でメンションください!


投げ銭はいりません。それより無料でできる拡散をしてください!! 感想をツイートしていただけることが一番嬉しいです!!