カードに関しては一通りデータベースができたと言うことで、
次のは検索部分を考慮してみる。
今回はカードレシピを作成することが前提と言うことなので、
基本的にはカードとその枚数を処理できればOKと言うことになる。
ただカードの正式名称をフルで入力しているときりがないので、
ある程度融通を利かせたい所だけど、
余り融通を利かせすぎても時間も掛かるし余計なカードも引っかかって
逆に使い勝手が悪くなりそう。
ということで、以下の様な前提をしてみる。
1、数とカード名は空白か「/」で分割されている
要するに「1 Terminate」という感じで、数とカード名は分離されているはず。
順序に関しては前後しても問題無いとしておく。
要するに「1 Terminate」でも「Terminate 1」でもOKとする。
空白はタブ、半角スペース、全角スペースに対応する。
2、カードは1種類1行
入力されるカードは1種類に関して1行とする。
同じカードが複数行で入力されている場合は、数を合計してやる。
カード枚数が入力されていないカードは1枚と計算する。
3、前後に《》がついていてもOK
要するに《取り消し》《取り消し/Cancel》といった感じの入力にも対応。
っていうか全角部分における「《》」を無視する。
後はこれを元に以下の様な形で検索する。
1、データを分解
まずはスペースとスラッシュで行を分解して要素に展開しておく。
2、データの正規化
英数字は原則半角に変換。
カタカナのみの要素はひらがなに変換。
数字のみの要素はカード枚数として扱う。
3、対応する要素で検索
数字のみ→カード枚数なので検索対象外
英数字のみ→英語名で検索
ひらがなのみ→よみで検索
それ以外→日本語名で検索
4、一致順序
まずは3のパターンを使って一通り検索。
優先順位としては、英語名→日本語名→よみの順で検索する。
カードがみつから無い場合は前方一致、後方一致、部分一致の順で
順番に検索していき、候補が見つかった時点で終了とする。
この手順でカードが1枚に絞れない時にはユーザーに確認する。
といった感じかな?
一致順序は複数回データベースへの問い合わせが発生しそうなので、
少し最適化を考えた方が良いかも。
とりあえず1のデータ分解までは作成してテストも上手く行ったので、
次はいよいよ本格的な検索部分を実装かな。
次のは検索部分を考慮してみる。
今回はカードレシピを作成することが前提と言うことなので、
基本的にはカードとその枚数を処理できればOKと言うことになる。
ただカードの正式名称をフルで入力しているときりがないので、
ある程度融通を利かせたい所だけど、
余り融通を利かせすぎても時間も掛かるし余計なカードも引っかかって
逆に使い勝手が悪くなりそう。
ということで、以下の様な前提をしてみる。
1、数とカード名は空白か「/」で分割されている
要するに「1 Terminate」という感じで、数とカード名は分離されているはず。
順序に関しては前後しても問題無いとしておく。
要するに「1 Terminate」でも「Terminate 1」でもOKとする。
空白はタブ、半角スペース、全角スペースに対応する。
2、カードは1種類1行
入力されるカードは1種類に関して1行とする。
同じカードが複数行で入力されている場合は、数を合計してやる。
カード枚数が入力されていないカードは1枚と計算する。
3、前後に《》がついていてもOK
要するに《取り消し》《取り消し/Cancel》といった感じの入力にも対応。
っていうか全角部分における「《》」を無視する。
後はこれを元に以下の様な形で検索する。
1、データを分解
まずはスペースとスラッシュで行を分解して要素に展開しておく。
2、データの正規化
英数字は原則半角に変換。
カタカナのみの要素はひらがなに変換。
数字のみの要素はカード枚数として扱う。
3、対応する要素で検索
数字のみ→カード枚数なので検索対象外
英数字のみ→英語名で検索
ひらがなのみ→よみで検索
それ以外→日本語名で検索
4、一致順序
まずは3のパターンを使って一通り検索。
優先順位としては、英語名→日本語名→よみの順で検索する。
カードがみつから無い場合は前方一致、後方一致、部分一致の順で
順番に検索していき、候補が見つかった時点で終了とする。
この手順でカードが1枚に絞れない時にはユーザーに確認する。
といった感じかな?
一致順序は複数回データベースへの問い合わせが発生しそうなので、
少し最適化を考えた方が良いかも。
とりあえず1のデータ分解までは作成してテストも上手く行ったので、
次はいよいよ本格的な検索部分を実装かな。
コメント
あと、Canselとか。