Re: 作物名検索語の前処理
OhYeah!
投稿数: 983
オンライン

お疲れ様です。「なす」とか「くり」とかで他の作物を検索することはなくなりましたね。
ただ、作物名直接入力の場合、たとえば「スイートコーン」と入力した場合に、「未成熟トウモロコシ」のみに登録がある農薬しか表示されないのがちょっと…。「作物名完全一致」チェックボックスは不要になるので、ここを上位・下位分類一括検索にしませんか? 携帯農薬検索では、下記のような方法で、第4階層の作物名を指定した場合は上位・下位を全て検索、第5階層の栽培条件及び第3階層の小分類以前を指定した場合は上位分類のみを検索するようにしています。最後の $cond の値が、作物を検索する SQL になります。
この場合、作物タブでは作物選択ダイアログボックスの「上位分類を含む」チェックボックスも不要になりますが、定型処理の作物選択ダイアログボックスでは必要なので、作物タブから呼んだときのみ非表示とかにしておいてもらえると助かります。
「"{$cid2}00"」 は 「$cid2."00"」と等価です。
ただ、作物名直接入力の場合、たとえば「スイートコーン」と入力した場合に、「未成熟トウモロコシ」のみに登録がある農薬しか表示されないのがちょっと…。「作物名完全一致」チェックボックスは不要になるので、ここを上位・下位分類一括検索にしませんか? 携帯農薬検索では、下記のような方法で、第4階層の作物名を指定した場合は上位・下位を全て検索、第5階層の栽培条件及び第3階層の小分類以前を指定した場合は上位分類のみを検索するようにしています。最後の $cond の値が、作物を検索する SQL になります。
この場合、作物タブでは作物選択ダイアログボックスの「上位分類を含む」チェックボックスも不要になりますが、定型処理の作物選択ダイアログボックスでは必要なので、作物タブから呼んだときのみ非表示とかにしておいてもらえると助かります。
$db = dbOpen();
$sql = "select level, idsaku, sakumotsu from m_sakumotsu where strconv(sakumotsu||'、'||betsumei) regexp '$kw' and sakumotsu not like '%除く%' order by idsaku";
$res = $db->query($sql);
$crops = $res->fetchAll(PDO::FETCH_ASSOC);
dbCloseStatement($res);
dbClose($db);
$cid = $crops[0]['idsaku'];
$cid2 = substr($cid, 0, 8);
$level = $crops[0]['level'];
$cond = _concat('|', substr($cid, 0, 2)."000000", substr($cid, 0, 4)."0000", substr($cid, 0, 5)."000");
if ($level == 3) $cond = _concat('|', $cond, "{$cid2}");
if ($level == 4) {
$cond = preg_replace("/(~|\|){$cid2}/", '', $cond);
$cond = _concat('|', $cond, "{$cid2}00", $cid);
}
$db = dbOpen();
$except = _concat('|', substr($cid, 0, 4)."000000", substr($cid, 0, 5)."00000", "{$cid2}00");
$sql = "select concat('|', sakumotsu) from sakumotsu where idsaku regexp '$except'";
$res = $db->query($sql);
if (!$res) sqlerror($sql, $db);
$except = $res->fetchColumn(0);
dbCloseStatement($res);
dbClose($db);
$except = '\((.*、)?('.str_replace(array('(', ')', '[', ']', '類'), array('\(?', '\)?', '\[?', '\]?', '(類)?'), $except).')(、.*)?を除く';
$crop = $crops[$cno]['sakumotsu'];
if (strpos($crop, '露地') !== false) $except .= '|施設|水耕';
if (strpos($crop, '施設') !== false) $except .= '|露地';
if (strpos($crop, '水耕') !== false) $except .= '|露地';
$cond = "select sakumotsu from m_sakumotsu where idsaku regexp '^($cond)' and sakumotsu not regexp '$except'";
_concat は、拡張 SQLite 関数の CONCAT と同じ機能の PHP ユーザ関数です。「"{$cid2}00"」 は 「$cid2."00"」と等価です。
投票数:6
平均点:6.67
投稿ツリー
-
作物名検索語の前処理 (OhYeah!, 2011.12.05 13:04)
-
Re: 作物名検索語の前処理 (kabe, 2011.12.07 12:32)
-
Re: 作物名検索語の前処理 (kabe, 2011.12.11 16:47)
-
Re: 作物名検索語の前処理 (OhYeah!, 2011.12.11 21:50)
-
-