
Notionを外部のツールとつないでいると、ときどき件数が合わなくなります。さっき作ったはずのページが、同期されていない。
次に動かすと、ちゃんと入っている。だから再現しないし、原因も分からない。そういう経験はないでしょうか。
実際に計測しました。原因は2つあって、どちらも検索の仕組みに関係しています。
作った直後は、検索に出てこない
まず1つ目です。
20秒かかりました
ページを1つ作って、そのページにしかない言葉で検索をかけました。作った直後、5秒後、10秒後、15秒後。どの時点でも見つかりません。
| 作ってから | 検索に出るか |
|---|---|
| 直後 | 出ない |
| 5秒後 | 出ない |
| 10秒後 | 出ない |
| 15秒後 | 出ない |
| 20秒後 | 見つかる |
データベースの行でも同じように測ったところ、約21秒でした。だいたい20秒前後、と考えておけばよさそうです。
ページを取りにいけば、すぐ読めます
誤解のないように書いておくと、ページ自体はすぐに存在しています。識別子を指定して取りにいけば、作った直後から中身が読めます。
遅れているのは検索のほうだけです。検索用の索引を作るのに時間がかかっている、ということだと思います。
エラーにはなりません
ここが厄介なところです。見つからないとき、エラーは返りません。正常に「0件です」と返ってきます。
0件なのか、まだ索引に載っていないだけなのか。返ってきたものからは区別がつきません。
同期で件数が合わない理由
ここまでが分かると、冒頭の現象に説明がつきます。
作ってすぐ探すと、見つからない
よくある作りがこれです。Notionにページを作って、その直後に検索で確認する。あるいは、他のツールで作ったものをNotionに入れて、すぐ数える。
20秒以内なら、作ったばかりのものは検索に出てきません。だから件数が1つ足りない。
次に動かすときには索引に載っているので、ちゃんと数えられます。再現しないのは、これが理由です。
毎回ずれるわけでもない
もっと厄介なのは、いつもずれるわけではないことです。
処理の途中に他の作業が挟まっていれば、20秒は経っています。そのときは合います。速く終わった日だけずれる。「たまにおかしい」という形で現れるので、原因を追いにくいです。
図にすると、こういう時間差です
関係のないページが大量に返る
2つ目の原因です。こちらは逆方向のずれを生みます。
存在しない言葉で引いても、結果が返る
試しに、どこにも書いていない造語で検索してみました。0件が返ると思いますよね。
296件返ってきました。中身を見ると、その造語とは関係のないページばかりです。
アルファベットの並びのような、日本語として区切れない文字列で引くと0件になります。つまり日本語の言葉は細かく区切られて、その一部でも当たれば返ってくるということのようです。
逆に、途中の文字でも引けます
「ゼータ特有語」というページに対して、「ータ特」という途中だけを切り出した文字列で検索しました。見つかります。
前方一致でも単語一致でもなく、かなり緩い当たり方をしています。
件数を信じてはいけません
ここから言えるのは1つです。検索の結果件数を、その言葉を含むページの数として扱ってはいけません。
「このキーワードを含むページが何件あるか」を数える用途には使えない、ということです。返ってきた中から、自分で絞り込む必要があります。
検索は「探す」には向いていない
2つの性質を合わせると、はっきりします。
足りないほうにも、多いほうにもずれる
索引の遅れで、あるはずのものが出てこない。緩い一致で、ないはずのものが出てくる。両方向にずれます。
しかも、どちらもエラーにならない。正常な結果として返ってきます。
向いている使い方は限られます
では何に使うのか。ざっと当たりを付ける用途には十分です。
「この言葉が出てくるページ、たぶんこのへん」を人が見る。そういう場面なら、多少余計なものが混ざっても困りません。
向いていないのは、機械が数える用途と、存在するかどうかを判定する用途です。正確さが求められる処理に入れないでください。
代わりに何を使うか
では、正確に探したいときはどうするか。
1. 識別子で直接取りにいく
いちばん確実です。作ったときに返ってくる識別子を手元に控えておいて、次からはそれで取りにいきます。
索引を経由しないので、遅れも緩い一致も関係ありません。作った直後から読めます。
同期の仕組みを作るなら、外部のデータとNotionの識別子を対応づけた表を持つのが基本形です。これがあれば、検索を使う場面がほとんどなくなります。
2. データベースの絞り込みを使う
データベースの中を探すなら、そのデータベースに対して条件を指定して問い合わせるほうが正確です。
この列がこの値と一致するもの、という形で指定できます。緩い一致は起きません。索引の遅れも、こちらでは確認していません。
探したいものがデータベースの中にあるなら、検索ではなくこちらを使ってください。ただし、書き込むときに表記が揺れていると一致しなくなるので、入れる側をそろえておくことが前提になります。
3. どうしても検索を使うなら、待つ
作った直後に検索で確認する必要があるなら、20秒以上あけます。
ただし、20秒というのは今回測った値です。混み具合で変わる可能性があります。余裕を見て30秒にするか、見つかるまで何度か試す作りにしておくほうが安全です。
そして、見つからなかったときに「無い」と断定しないこと。まだ載っていないだけかもしれません。
それでも検索を使う場面
使い道がないわけではありません。向いている場面を書いておきます。
ワークスペース全体を見渡すとき
検索は、条件を何も付けなければワークスペースのページをすべて返してくれます。これは他の手段では代わりになりません。
どこにどれだけページがあるかを把握したい、古いページを洗い出したい。こういう棚卸しの用途では、これが出発点になります。
ただし、ゴミ箱に入れたページは検索に出てきません。消したページは印が付いているだけで残っているので、棚卸しのつもりで数えると、消したはずのものが勘定から外れていることになります。
人が目で選ぶとき
候補を出して人が選ぶ、という作りなら緩い一致は欠点になりません。余計なものが混ざっても、見れば分かります。
むしろ、表記が揺れていても拾ってくれるぶん、都合がいい場面もあります。
後片付けの確認に使うとき
これは私の使い方ですが、検証で作ったページを消したあと、残っていないかを確認するのに使っています。
緩く当たるということは、取りこぼしが少ないということでもあります。消し忘れを探す用途では、多めに返ってくるほうが安心です。
よくある質問(FAQ)
20秒は必ず待てば大丈夫ですか。
今回測った値なので、混み具合で変わる可能性があります。余裕を見て30秒にするか、見つかるまで何度か試す作りにしておくほうが安全です。20秒を固定の答えとして埋め込まないでください。
本文に書いた言葉でも検索できますか。
できました。ページのタイトルだけでなく、本文に入れた言葉でも見つかります。ただし、こちらも索引に載るまでの時間はかかります。
データベースの行も検索に出ますか。
出ます。今回の計測では約21秒で出てきました。ただし、データベースの中を正確に探すなら、そのデータベースに条件を指定して問い合わせるほうが確実です。
なぜ関係のないページが返るのですか。
日本語の言葉が細かく区切られて、その一部でも当たれば返ってくるようです。アルファベットの並びのような区切れない文字列だと0件になりました。仕組みの詳細までは確かめていません。
「ページが存在するか」の判定に使えますか。
使わないほうがいいです。索引の遅れで、あるものが出てこないことがあります。判定には識別子を指定した取得を使ってください。
検索の結果は何件まで返りますか。
一度に返る件数には上限があり、続きは印を使って取りにいく形でした。全部を数えたいなら、最後まで取りにいく必要があります。
識別子を控えるところから始めてください
外部のデータとNotionの識別子を対応づけた表を1つ持つ。これがあるだけで、検索を使う場面がほとんどなくなります。件数が合わない、という相談の多くはここで消えます。