\"\" and \"type\"<>'.ctl.' ";
if ($debug) {
echo "filename:" . $db_file . "
";
echo $query . "
";
}
$FetchAllWord = PDO_FetchAll($query);
$iFetch = count($FetchAllWord);
if ($iFetch == 0) {
echo json_encode(array(), JSON_UNESCAPED_UNICODE);
exit;
}
$voc_list = array();
foreach ($FetchAllWord as $word) {
$voc_list[$word["real"]] = 1;
}
if ($debug) {
echo "单词表共计:" . count($voc_list) . "词
";
}
//查询单词表结束
$word_list = array();
foreach ($voc_list as $word => $value) {
array_push($word_list, $word);
}
$lookup_loop = 2;
$dict_word_spell = array();
$output = array();
$db_file_list = array();
//字典列表
/*
array_push($db_file_list, array(_FILE_DB_WBW1_, " ORDER BY rowid DESC"));
array_push($db_file_list, array(_DIR_DICT_SYSTEM_ . "/sys_regular.db", " ORDER BY confidence DESC"));
array_push($db_file_list, array(_DIR_DICT_SYSTEM_ . "/sys_irregular.db", ""));
array_push($db_file_list, array(_DIR_DICT_SYSTEM_ . "/union.db", ""));
array_push($db_file_list, array(_DIR_DICT_SYSTEM_ . "/comp.db", ""));
array_push($db_file_list, array(_DIR_DICT_3RD_ . "/pm.db", ""));
array_push($db_file_list, array(_DIR_DICT_3RD_ . "/bhmf.db", ""));
array_push($db_file_list, array(_DIR_DICT_3RD_ . "/shuihan.db", ""));
array_push($db_file_list, array(_DIR_DICT_3RD_ . "/concise.db", ""));
array_push($db_file_list, array(_DIR_DICT_3RD_ . "/uhan_en.db", ""));
*/
$db_file_list[] = array("","wbwdict://new/".$_COOKIE["userid"],true);
$db_file_list[] = array(_FILE_DB_TERM_,"dict://term",true);
$db_file_list[] = array(_FILE_DB_WBW1_,"dict://user",true);
$db_file_list[] = array( _DIR_DICT_SYSTEM_ . "/sys_regular.db","dict://regular",true);
$db_file_list[] = array( _DIR_DICT_SYSTEM_ . "/sys_irregular.db","dict://irregular",true);
$db_file_list[] = array( _DIR_DICT_SYSTEM_ . "/union.db","dict://union",true);
$db_file_list[] = array( _DIR_DICT_SYSTEM_ . "/comp.db","dict://comp",true);
$db_file_list[] = array( _DIR_DICT_3RD_ . "/pm.db","dict://pm",true);
$db_file_list[] = array( _DIR_DICT_3RD_ . "/bhmf.db","dict://bhmf",true);
$db_file_list[] = array( _DIR_DICT_3RD_ . "/shuihan.db","dict://shuihan",true);
$db_file_list[] = array( _DIR_DICT_3RD_ . "/concise.db","dict://concise",true);
$db_file_list[] = array( _DIR_DICT_3RD_ . "/uhan_en.db","dict://uhan_en",true);
$_dict_db = array();
foreach ($db_file_list as $db_file) {
try {
if ($redis && !empty($db_file[1])) {
$dbh=null;
}
else{
$dbh = new PDO("sqlite:" . $db_file[0], "", "");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$dbh->query("PRAGMA synchronous = OFF");
$dbh->query("PRAGMA journal_mode = WAL");
$dbh->query("PRAGMA foreign_keys = ON");
$dbh->query("PRAGMA busy_timeout = 5000");
}
$_dict_db[] = array("file" => $db_file[0], "dbh" => $dbh,"redis"=>$db_file[1],"static"=>$db_file[2]);
} catch (PDOException $e) {
if ($debug) {
print "Error!: " . $e->getMessage() . "
";
}
}
}
$lookuped=array();
for ($i = 0; $i < $lookup_loop; $i++) {
$parent_list = array();
# 记录已经查过的词,下次就不查了
$newWordList = array();
foreach ($word_list as $lsWord) {
if(!isset($lookuped[$lsWord]) && !empty($lsWord)){
$newWordList[]=$lsWord;
$lookuped[$lsWord]=1;
}
}
if(count($newWordList)==0){
break;
}
$word_list = $newWordList;
# 记录已经查过的词结束
$strQueryWord = "("; //单词查询字串
foreach ($word_list as $word) {
$word = str_replace("'", "’", $word);
$strQueryWord .= "'{$word}',";
}
$strQueryWord = mb_substr($strQueryWord, 0, mb_strlen($strQueryWord, "UTF-8") - 1, "UTF-8");
$strQueryWord .= ")";
if ($debug) {
echo "
第{$i}轮查询:$strQueryWord
";
}
foreach ($_dict_db as $db) {
$db_file = $db["file"];
if ($debug) {
echo "dict:$db_file
";
}
$strOrderby = $db["file"][1];
if ($i == 0) {
$query = "select * from dict where \"pali\" in {$strQueryWord} AND ( type <> '.n:base.' AND type <> '.ti:base.' AND type <> '.adj:base.' AND type <> '.pron:base.' AND type <> '.v:base.' AND type <> '.part.' ) " . $strOrderby;
} else {
$query = "select * from dict where \"pali\" in {$strQueryWord} " . $strOrderby;
}
if ($debug) {
echo $query . "
";
}
$Fetch = array();
if ($redis && !empty($db["redis"])) {
if ($debug) {
echo "redis:{$db["redis"]}
";
}
foreach ($word_list as $word) {
$wordData = $redis->hGet($db["redis"],$word);
if($wordData){
if(!empty($wordData)){
$arrWord = json_decode($wordData,true);
foreach ($arrWord as $one) {
# code...
if(count($one)==14){
$Fetch[] = array("id"=>$one[0],
"pali"=>$one[1],
"type"=>$one[2],
"gramma"=>$one[3],
"parent"=>$one[4],
"mean"=>$one[5],
"note"=>$one[6],
"parts"=>$one[7],
"partmean"=>$one[8],
"status"=>$one[9],
"confidence"=>$one[10],
"dict_name"=>$one[12],
"lang"=>$one[13]
);
}
else{
$Fetch[] = array("id"=>$one[0],
"pali"=>$one[1],
"type"=>$one[2],
"gramma"=>$one[3],
"parent"=>$one[4],
"mean"=>$one[5],
"note"=>$one[6],
"parts"=>$one[7],
"partmean"=>"",
"status"=>$one[8],
"confidence"=>$one[9],
"dict_name"=>$one[10],
"lang"=>$one[12]
);
}
}
}
}
else{
# 没找到就不找了
}
}
}
else{
try {
//$Fetch = PDO_FetchAll($query);
$stmt = $db["dbh"]->query($query);
if ($stmt) {
$Fetch = $stmt->fetchAll(PDO::FETCH_ASSOC);
} else {
$Fetch = array();
if ($debug) {
echo "无效的Statement句柄";
}
}
} catch (Exception $e) {
if ($debug) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
continue;
}
}
$iFetch = count($Fetch);
if ($debug) {
echo "count:{$iFetch}
";
}
if ($iFetch > 0) {
foreach ($Fetch as $one) {
$id = $one["id"];
if (isset($one["guid"])) {
$guid = $one["guid"];
} else {
$guid = "";
}
if (isset($one["lang"])) {
$language = $one["lang"];
} else if (isset($one["language"])) {
$language = $one["language"];
} else {
$language = "en";
}
$pali = $one["pali"];
$dict_word_spell["{$pali}"] = 1;
$type = $one["type"];
$gramma = $one["gramma"];
$parent = $one["parent"];
if (inLangSetting($language, $user_setting["dict.lang"])) {
$mean = $one["mean"];
} else {
$mean = "";
}
if (isset($one["note"])) {
$note = $one["note"];
} else {
$note = "";
}
if (isset($one["parts"])) {
$parts = $one["parts"];
} else if (isset($one["factors"])) {
$parts = $one["factors"];
} else {
$parts = "";
}
if (isset($one["partmean"])) {
$partmean = $one["partmean"];
} else if (isset($one["factormean"])) {
$partmean = $one["factormean"];
} else {
$partmean = "";
}
if (inLangSetting($language, $user_setting["dict.lang"]) == false) {
$partmean = "";
}
if (isset($one["part_id"])) {
$part_id = $one["part_id"];
} else {
$part_id = "";
}
if (isset($one["status"])) {
$status = $one["status"];
} else {
$status = "";
}
if (isset($one["dict_name"])) {
$dict_name = $one["dict_name"];
} else {
$dict_name = "";
}
array_push($output, array(
"id" => $id,
"guid" => $guid,
"pali" => $pali,
"type" => $type,
"gramma" => $gramma,
"parent" => $parent,
"mean" => $mean,
"note" => $note,
"parts" => $parts,
"part_id" => $part_id,
"partmean" => $partmean,
"status" => $status,
"dict_name" => $dict_name,
"language" => $language,
));
if (!empty($parent)) {
if ($pali != $parent) {
$parent_list[$one["parent"]] = 1;
}
}
if ($type != "part") {
if (isset($one["factors"])) {
$parts = str_getcsv($one["factors"], '+');
foreach ($parts as $x) {
if (!empty($x)) {
if ($x != $pali) {
$parent_list[$x] = 1;
}
}
}
}
}
}
}
$PDO = null;
}
/*
if($i==0){
//自动查找单词词干
$word_base=getPaliWordBase($in_word);
foreach($word_base as $x=>$infolist){
foreach($infolist as $gramma){
array_push($output,
array("pali"=>$in_word,
"type"=>$gramma["type"],
"gramma"=>$gramma["gramma"],
"mean"=>"",
"parent"=>$x,
"parts"=>$gramma["parts"],
"partmean"=>"",
"language"=>"en",
"dict_name"=>"auto",
"status"=>128
));
$part_list=str_getcsv($gramma["parts"],"+");
foreach($part_list as $part){
$parent_list[$part]=1;
}
}
}
}
*/
if ($debug) {
echo "parent:" . count($parent_list) . "
";
//print_r($parent_list)."
";
}
if (count($parent_list) == 0) {
break;
} else {
$word_list = array();
foreach ($parent_list as $x => $value) {
array_push($word_list, $x);
}
}
}
//查询结束
//删除无效数据
$newOutput = array();
foreach ($output as $value) {
if ($value["dict_name"] == "auto") {
if (isset($dict_word_spell["{$value["parent"]}"])) {
array_push($newOutput, $value);
}
} else {
array_push($newOutput, $value);
}
}
if ($debug) {
echo "";
}
if ($debug) {
echo "生成:" . count($output) . "
";
echo "有效:" . count($newOutput) . "
";
}
//开始匹配
$counter = 0;
$output = array();
foreach ($FetchAllWord as $word) {
$pali = $word["real"];
$type = "";
$gramma = "";
$mean = "";
$parent = "";
$parts = "";
$partmean = "";
foreach ($newOutput as $dictword) {
if ($dictword["pali"] == $pali) {
if ($type == "" && $gramma == "") {
$type = $dictword["type"];
$gramma = $dictword["gramma"];
}
if (trim($mean) == "") {
$mean = str_getcsv($dictword["mean"], "$")[0];
}
if ($parent == "") {
$parent = $dictword["parent"];
}
if ($parts == "") {
$parts = $dictword["parts"];
}
if ($partmean == "") {
$partmean = $dictword["partmean"];
}
}
}
if ($mean == "" && $parent != "") {
foreach ($newOutput as $parentword) {
if ($parentword["pali"] == $parent) {
if ($parentword["mean"] != "") {
$mean = trim(str_getcsv($parentword["mean"], "$")[0]);
if ($mean != "") {
break;
}
}
}
}
}
if ($type != "" ||
$gramma != "" ||
$mean != "" ||
$parent != "" ||
$parts != "" ||
$partmean != "") {
$counter++;
}
array_push($output,
array("book" => $in_book,
"paragraph" => $word["paragraph"],
"num" => $word["wid"],
"pali" => $word["real"],
"type" => $type,
"gramma" => $gramma,
"mean" => $mean,
"parent" => $parent,
"parts" => $parts,
"partmean" => $partmean,
"status" => 3,
));
}
if ($debug) {
echo "";
}
if ($debug) {
echo "匹配" . (($counter / count($FetchAllWord)) * 100) . "
";
foreach ($output as $result) {
//echo "{$result["pali"]}-{$result["mean"]}-{$result["parent"]}
";
}
$queryTime = (microtime_float() - $time_start) * 1000;
echo "搜索时间:$queryTime 毫秒
";
}