ほっぷ、すてっぷ、文字を検索する

公開日:

はじめに

こんにちは、サポートの沖です。

kintoneの文字検索は色々と便利ですが制限もありますよね。代表的なのは文字列内の1文字だけを検索対象に出来ないという制限です。簡単に言うと「あいう」と言う文字があった場合に「あ」だけで検索できないと言うケースですね。「あい」なら検索出来るのであまり影響はないように思いますが、私の氏名の場合だと姓名が繋がっていた場合は姓だけでは検索出来ません(涙

この場合、検索対象のレコードを事前に読み込んでからメモリ内で検索するという方法や、kintone外にデータをコピーしておいてそちらを検索する方法もありますが、これらの場合は処理スピードやデータの同期・権限やセキュリティなど、様々な点を考慮する必要があります。

注意

本記事は情報提供を目的としており、本記事の内容は無保証、サポートの対象外です。
サポート窓口、問合せ窓口にご質問をいただいても対応いたしかねますのでご了承ください。

検索時の文字種の確認

検索についてはサイボウズさんのページでも紹介されています。文字種によって違いがあるので簡単にまとめてみます。

漢字

2文字以上のキーワードで検索する必要があります。

記号

句読点や記号は検索時のキーワードに入力していても除外して検索されます。主な記号は以下です。
– & | / ! ( ) { } [ ] ^ ” ~ * ? : ; \ $ % @ ‘ ` = < > , .

除外というのは、空欄扱いになるのではなく、空白と同じ扱いになります。ですので、「A&B」「A$B」「A B」はどのキーワードで検索しても全て検索結果に含まれます。

英数字

単語単位で検索になる点が他とは大きく違います。また数字が付いている場合は単語の一部とみなされます。

ですので、

  • yamada1
  • yamada2

とあった場合に、yamadaだけで検索ということができません。

このように単語の一部とみなされる文字が記号にもあり、 _ # + で単語を繋いでいると全てが1単語になります。例えば、

  • yamada_1
  • yamada_2

を、yamadaで検索することはできません。しかし、

  • yamada-1
  • yamada-2

であれば、yamadaで検索可能です。この仕組みを利用してルックアップのキーにする方法はよく使われていると思います。(その方法の良し悪しは置いておいて。。)

全角と半角の違い

半角がある文字は大体は全角もあると思います。その場合には検索では区別されません。「ア」と「ア」の場合はどちらを指定して検索してもどちらも検索結果に含まれます。「あ」のように半角文字がない場合は考慮は不要です。

アルファベットの場合は更に、「A」と「a」も区別されません。ですので、「A」と「a」と「A」と「a」はどれで検索してもどれも検索に含まれるということになります。

「等しい」と「含む」の違い

一覧画面で絞り込み条件を見ると、「等しい」と「次のキーワードを含む」があると思います。この違いは完全一致と部分一致という違いです。このブログで対象にしているのは「次のキーワードを含む」の方です。

なお、「等しい」の注意点としては64文字上限があります。「次のキーワードを含む」の方はその上限はありません。ただ、検索ボックスに入力可能なのは100文字までのようです。詳細はサイボウズさんのページもご確認ください。

https://jp.cybozu.help/k/ja/search/search_details.html#search_search_details_60

関連レコードの表示

関連レコードは、フィールド値が同一のレコードを表示することが出来ます。同一ですので「等しい」と同じ検索条件です。

もし、関連レコードの「表示するレコードの条件」の値が64文字を超えていたらどうなるかというと、64文字より多い部分は削除して検索になります。そのため、フィールド値が70字くらいの値で他レコードの値と前方一致してしまうと、値が違うレコードが表示されるという動きになっているようです。

要注意ですね。

絞り込みで検索する場合とURL内のクエリで指定する場合の違い

絞り込みのダイアログでは、「すべての条件を満たす」(= and)か「いずれかの条件を満たす」(= or)のどちらかを選択できます。なので、andとorを混在させることが出来ません。また、条件を入れ子のようにすることも出来ません。

例:(氏名が山田を含み、年齢が30代) か (氏名が田中を含み、年齢が20代)のような検索

しかし、URL内のクエリであればそのような指定が可能になります。指定方法の詳細はこちらのページをご確認ください。

https://cybozu.dev/ja/kintone/docs/js-api/app/specify-record-list-via-query-string

検索用文字列を作成する」の仕組み

漢字1文字や英数の一部分を検索する場合、検索可能な文字を事前に作成しておくという方法があります。例えば「あいう」→「あ い う あい いう あいう」と変換します。半角スペースがあると文字としては分割されたことになるので、「あ」だけで検索可能になります。

ただ、この仕組みの場合は検索用文字列の文字数が非常に多くなります。例えば64文字を元に生成すると重複文字を排除しても2143文字になります。「検索用文字列を作成する」の場合は、「あああ」とあると「あ ああ あああ」となり、「あ あ あ ああ ああ あああ」のように重複する文字は自動的に除外されます。

文字の途中で1文字変えてみると、こうなります。

約3万5000字。。。なので、検索用文字列の元のフィールドには64文字制限があります。実は、この仕組みで元の文字に制限がなく文字列複数行などの長いフィールド値になると、作成した検索文字列を保存はできるけど表示できないレコードというものが出来てしまいます(経験談)。何事も程々にしないとですね。

漢字だけ1文字検索に対応する

長い文字列になる問題に対しての対応策として、

  • 元のフィールドに漢字だけが入力される
  • 英数の部分一致は不要

という前提がある場合なら、元の文字列と1文字ずつ半角スペースで区切った文字列を結合するという方法があります。

例:「あいう」→「あ い う あいう」

2文字以上は通常の検索で対応可能なので、1文字だけの場合を追加するという発想です。この場合、「フィールドの値の一部を文字列置換する」で、以下のような設定にすると各文字の間に半角スペースが追加できます。この置換結果と元の文字を半角スペースで区切って結合すると検索用文字が出来ます。

半角スペースで区切るだけなので同じ文字を排除できていませんが、検索文字列の生成よりはかなり文字数が減ったと思います。

英数は1文字検索に対応できる?

同じような発想で英数も対応できないかと思うのですが、英数の場合は2文字以上かどうかに関係なく部分一致ができないので実現できません。

フィールドの値の一部を文字列置換する」で半角スペースを入れることで1文字の検索は可能になるので、検索時のキーワードを工夫すると可能性はありそうですね。(意味深)

記号を検索するには?

記号でも「フィールドの値の一部を文字列置換する」で半角スペースを入れることで1文字の検索が・・・出来ません。2文字以上も1文字も何も検索できません。記号はどの文字を入れても半角スペースと同じ扱いになるので文字を識別できないという問題があります。

・・・ムツカシイ。。。

この場合は記号以外の文字に変換すると少しは可能性が出てきそうです。例えば、「encodeuricomponent 関数」と「フィールドの値の一部を文字列置換する」で %20 を半角スペースに戻すと、記号ありの文字は以下のようになります。

この場合「A$B」→「A %24 B」で、「A%B」→「A %25 B」となるので識別可能です。%を何かの数字に変えておくと更に良さそうですね。それでも対応できない記号が「- ! ( ) ~ * ‘ .」のようですが、これは検索できなくても良いのでは、という気もします(^^;

どうしても検索したいという場合は、「フィールドの値の一部を文字列置換する」で個別の何かの文字に変換しておく方法は考えられます。

AとaとAとa

記号の時と同じ方法で変換すると以下のようになります。全角の大文字と小文字が「%EF%BC%A1」と「%EF%BD%81」のように識別可能になります。

ただ、Aとaを識別することは出来ないようです。この場合はAを「A1」、aを「a2」に置換することで擬似的に識別はできそうです。「正規表現を用いてフィールドの値を置換する」で設定すると、AからZの場合はこのような設定になります。

これによって、kとKを識別することができるので、Kintoneだけを検索可能になりますね!

さて、まとめると?

このような絞り込みをしたとします。

結果は2レコードです。kの大文字と小文字は同じ扱いなのでkintoneの仕様通りですね。

そこで検索文字列に対して検索するとこうなります。

すごい! 検索出来てる!

どんな文字で検索しているかというと、こちら。

この仕組みの設定はこんな感じです。

さいごに

検索時のキーワードをどうやって生成するかという点はありますので、実際に検索するのであれば一覧画面ではなく検索用アプリの編集画面が起点になると思います。それであればルックアップにも応用できそうですね。

検索用の文字列を事前に生成しておく方法だと、対象アプリにレコードが100万件あっても全レコードが検索対象になるので、大量のレコードを扱うようなケースでも部分一致検索が可能です。検索結果が10万件までというkintoneの仕様がありますが、実際にはそのケースは少ないように思うので大丈夫でしょう。

ということで、100万件のレコードから1万件の検索結果があっという間に表示可能な仕組みなので、皆さんも色々と検索方法を試してみましょう!

投稿者プロフィール

アバター画像
"サイボウズ公認kintoneエバンジェリスト
カスタマインやデプロイットでも色々とやってます"