FirestoreでLike風検索(前方一致)を試す


Firestoreのクエリは相変わらずですが、工夫すればなんちゃって前方検索ができるというのは記事でみて知っていましたが、自分で試したことがなかったのでやってみたメモ。

いちおう日本語とかで正しく処理できるかとか試して見たかった。

挿入部は必要に応じてコメントイン・アウトお願いします。

index.js
const admin = require('firebase-admin');

admin.initializeApp({
    credential: admin.credential.cert('/path/to/key.json'),
    databaseURL: 'https://xxxxxxxxxx.firebaseio.com',
});

const db = admin.firestore();

(async () => {

    // db.collection("dictionaries").add({
    //     jpName: '山田 太郎',
    //     enName: 'Taro Yamada',
    // })

    // db.collection("dictionaries").add({
    //     jpName: '山田 花子',
    //     enName: 'Hanako Yamada',
    // })

    // db.collection("dictionaries").add({
    //     jpName: '山田次郎',
    //     enName: 'Jiro Yamada',
    // })

    // db.collection("dictionaries").add({
    //     jpName: '鈴木 花子',
    //     enName: 'Hanako Suzuki',
    // })

    // db.collection("dictionaries").add({
    //     jpName: '佐藤 一郎',
    //     enName: 'Ichiro Sato',
    // })


    //クエリ
    const keyword = "山田";
    const snapshots = await db.collection("dictionaries").orderBy("jpName").startAt(keyword).endAt(keyword + '\uf8ff').get();
    const docs = snapshots.docs.map(doc => doc.data());
    console.log(docs);

})()

実行。

node index.js


[
  { jpName: '山田 太郎', enName: 'Taro Yamada' },
  { jpName: '山田 花子', enName: 'Hanako Yamada' },
  { jpName: '山田次郎', enName: 'Jiro Yamada' }
]

当然ですが、日本語、英語で問題なく動きます。

あと、keyword="山田次郎"といった完全一致(風)でももちろんヒットします。

名前を検索するのであれば、姓、名でフィールドを分けて、検索用にnameArrayとか配列フィールドを作って['山田','花子']などとして、.where("nameArray","array-contains-any",["山田","花子"])とかした方が現実的かも。

標準機能にLike検索(部分一致)欲しいなあ。。。