2018年9月6日木曜日

firebaseのfirestoreで文字列のプレフィックス検索(前方一致検索)を行いたい的なお話し

  • このエントリーをはてなブックマークに追加

firebaseはなかなか便利なもので。
中規模程度までのもので、SNSとかじゃないリレーションがあまり発生しないアプリとかサービスだったらオススメ的な。
とりあえずサーバサイドを書かずともいろんなのが使えるサービスだよ的な。

で、今日はそんなfirebaseでfirestoreを使っているんだけども。
firestoreのドキュメントを見ていると検索をするときに文字列型なのに">="とか使っているからどういうこっちゃと。
これの意味がわからないんだけど試してみるとどうやら文字が検索できるっぽい。
色々と調べたり試してみるとプレフィックス検索ができるみたい。

てなわけで今日はfirestoreにて文字列のプレフィックス検索を行う的なお話しをば。

ちなみに先に述べておくと、全文検索はできない。
MySQLでいうLIKEみたいなものもできない。
前方一致とかを行うために文字列型を>=したりする。
ということでどういうことかという解説をば。

citiesRef.where('state', '>=', 'CA').where('state', '<=', 'IN');

https://firebase.google.com/docs/firestore/query-data/queries?hl=ja
これはfirebaseのガイドに記述されていたものなんだけど正直言うと意味が全くわからない。
というよりも情報が少なすぎるので下記を参考にしてもらえるとわかりやすい。

cities:{
  SF:{
    state:"CA"
  },
  LA:{
    state:"CA1"
  },
  DC:{
    state:"DCCA"
  },
  TOK:{
    state:"CBAC"
  },
  BJ:{
    state:"ZMBK"
  }
}
const keyword = "CA"

const strlength = keyword.length;
const strFrontCode = keyword.slice(0, strlength - 1);
const strEndCode = keyword.slice(strlength - 1, keyword.length);

const startcode = keyword;
const endcode = strFrontCode + String.fromCharCode(strEndCode.charCodeAt(0) + 1);

const qs = firebase.firestore().collection("cities").where("state","<=",startcode).where("state",">",endcode).get();
console.log(qs.docs.map(doc => ({ name: doc.id, key: doc.id })));

ガイドのデータを適当に弄ってみた。
stateがCAで始めるドキュメントを探したいという感じ。
firestoreで保存されている文字列はUnicodeであるっぽく、だから文字列の前方一致を検索するにはUnicode変換してあげる必要がある。
ちなみに前方一致検索の前提で進んでいるが、前方一致のやり方しかわからない。
とりあえずこんな感じでやれば前方一致できるという紹介ではある。
正直なところ>=とか<=とかよくわからない。

firestoreは便利だけどやっぱりNoSQL的な感じなので文字列検索ができなかったり、前方一致とかそういったものに関しても説明が少なすぎる的な。
もしかしたらdatastoreとかと似たようなものだからそっち系のドキュメント漁ってみると意外とあるかもしれないが。

とりあえずこんな感じで前方検索ができるよ的なみたいな。

Adsense