FirestoreでLike風検索(前方一致)を試す
Firestoreのクエリは相変わらずですが、工夫すればなんちゃって前方検索ができるというのは記事でみて知っていましたが、自分で試したことがなかったのでやってみたメモ。
いちおう日本語とかで正しく処理できるかとか試して見たかった。
挿入部は必要に応じてコメントイン・アウトお願いします。
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検索(部分一致)欲しいなあ。。。
Author And Source
この問題について(FirestoreでLike風検索(前方一致)を試す), 我々は、より多くの情報をここで見つけました https://qiita.com/zaburo/items/4a8354c1f2055891f6cb著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .