dictList)->select('id','shortname')->get(); $dict_name = []; foreach ($dict_info as $key => $value) { # code... $dict_name[$value->id] = $value->shortname; } $caseman = new CaseMan(); $output = array(); $wordPool = array(); $input = \explode(',',$request->get("word")); foreach ($input as $word) { $wordPool[$word] = ['base' => false,'done' => false,'apply' => false]; } Log::info("query start ".$request->get("word")); if(empty($request->get("deep"))){ $deep = 2; }else{ $deep = $request->get("deep"); } for ($i=0; $i < $deep; $i++) { # 查询深度 foreach ($wordPool as $word => $info) { # code... if($info['done'] === false){ $wordPool[$word]['done'] = true; $count = 0; foreach ($this->dictList as $dictId) { # code... $result = Cache::remember("dict/{$dictId}/".$word,10,function() use($word,$dictId,$dict_name){ $data = UserDict::where('word',$word)->where('dict_id',$dictId)->orderBy('confidence','desc')->get(); foreach ($data as $key => $value) { # code... $value->dict_shortname = $dict_name[$dictId]; } return $data; }); $count += count($result); if(count($result)>0){ foreach ($result as $dictword) { # code... array_push($output,$dictword); if(!isset($wordPool[$word]['factors']) && !empty($dictword->factors)){ //将第一个拆分作为最佳拆分存储 $wordPool[$word]['factors'] = $dictword->factors; Log::info("best factor:{$dictword->factors}"); } } } } Log::info("query {$word} ".((microtime(true)-$startAt)*1000)."s."); if($count == 0){ //没查到 去尾查 Log::info("没查到 去尾查"); $newBase = array(); $parents = $caseman->WordToBase($word); foreach ($parents as $base => $rows) { Log::info("found:{$base}"); array_push($output,$rows); } Log::info("去尾查结束"); } } } //查询结果中的拆分信息 $newWordPart = array(); foreach ($wordPool as $word => $info) { if(!empty($info['factors'])){ $factors = \explode('+',$info['factors']); foreach ($factors as $factor) { # 将没有的拆分放入单词查询列表 if(!isset($wordPool[$factor])){ $newWordPart[$factor] = 0; } } } } foreach ($newWordPart as $part => $value) { # 将拆分放入池中 $wordPool[$part] = ['base' => false,'done' => false,'apply' => false]; } Log::info("loop {$i} ".((microtime(true)-$startAt)*1000)."s."); } return $this->ok(["rows"=>$output,'count'=>count($output)]); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * Display the words best match in specified sentence . * * @param string $sentId * @return \Illuminate\Http\Response */ public function show(string $sentId) { //查询句子中的单词 $sent = \explode('-',$sentId); WbwTemplate::where('book',$sent[0]) ->where('paragraph',$sent[1]) ->whereBetween('wid',[$sent[2],$sent[3]]) ->orderBy('wid') ->get(); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param \App\Models\UserDict $userDict * @return \Illuminate\Http\Response */ public function update(Request $request, UserDict $userDict) { // } /** * Remove the specified resource from storage. * * @param \App\Models\UserDict $userDict * @return \Illuminate\Http\Response */ public function destroy(UserDict $userDict) { // } }