visuddhinanda 3 лет назад
Родитель
Сommit
4d35f7e5b1
1 измененных файлов с 74 добавлено и 90 удалено
  1. 74 90
      app/Http/Controllers/SearchController.php

+ 74 - 90
app/Http/Controllers/SearchController.php

@@ -36,38 +36,7 @@ class SearchController extends Controller
         }else if($request->has('tags')){
             //查询搜索范围
             $tags = explode(',',$request->get('tags'));
-            $tagIds = Tag::whereIn('name',$tags)->select('id')->get();
-            $paliTextIds = TagMap::where('table_name','pali_texts')->whereIn('tag_id',$tagIds)->select('anchor_id')->get();
-            $paliPara=[];
-            foreach ($paliTextIds as $key => $value) {
-                # code...
-                if(isset($paliPara[$value->anchor_id])){
-                    $paliPara[$value->anchor_id]++;
-                }else{
-                    $paliPara[$value->anchor_id]=1;
-                }
-            }
-            $paliId=[];
-            foreach ($paliPara as $key => $value) {
-                # code...
-                if($value===count($tags)){
-                    $paliId[] = $key;
-                }
-            }
-            $para = PaliText::where('level',1)->whereIn('uid',$paliId)->get();
-            Log::info($para);
-
-            if(count($para)>0){
-                foreach ($para as $key => $value) {
-                    # code...
-                    $book_id = BookTitle::where('book',$value['book'])->where('paragraph',$value['paragraph'])->value('id');
-                    if(!empty($book_id)){
-                        $searchBookId[] = $book_id;
-                    }
-                    $searchChapters[] = ['book'=>$value['book'],'paragraph'=>$value['paragraph']];
-                }
-                $queryBookId = ' AND pcd_book_id in ('.implode(',',$searchBookId).') ';
-            }
+            $queryBookId = ' AND pcd_book_id in ('.implode(',',$this->getBookIdByTags($tags)).') ';
         }
 
         $key = explode(';',$request->get('key')) ;
@@ -75,19 +44,6 @@ class SearchController extends Controller
         $countParam = [];
         switch ($request->get('match','case')) {
             case 'complete':
-                # code...
-                $querySelect_rank = "
-                ts_rank('{0.1, 0.2, 0.4, 1}',
-                    full_text_search_weighted,
-                    websearch_to_tsquery('pali', ?))
-                AS rank, ";
-                $querySelect_highlight = " ts_headline('pali', content,
-                websearch_to_tsquery('pali', ?),
-                'StartSel = ~~, StopSel = ~~,MaxWords=3500, MinWords=3500,HighlightAll=TRUE')
-                AS highlight,";
-                $queryWhere = " full_text_search_weighted @@ websearch_to_tsquery('pali', ?) ";
-                $param = [$key[0],$key[0],$key[0]];
-                break;
             case 'case':
                 # code...
                 $querySelect_rank_base = " ts_rank('{0.1, 0.2, 0.4, 1}',
@@ -101,33 +57,31 @@ class SearchController extends Controller
                                             'StartSel = ~~, StopSel = ~~,MaxWords=3500, MinWords=3500,HighlightAll=TRUE')
                                             AS highlight,";
                 array_push($param,implode(' ',$key));
-                $queryWhereBase = " full_text_search_weighted @@ websearch_to_tsquery('pali', ?) ";
-                $queryWhereBody = implode(' or ', array_fill(0, count($key), $queryWhereBase));
-                $queryWhere = " ({$queryWhereBody}) ";
-                $param = array_merge($param,$key);
                 break;
             case 'similar':
                 # 形似,去掉变音符号
+                $key = Tools::getWordEn($key[0]);
                 $querySelect_rank = "
                     ts_rank('{0.1, 0.2, 0.4, 1}',
                         full_text_search_weighted_unaccent,
                         websearch_to_tsquery('pali_unaccent', ?))
                     AS rank, ";
-                    $querySelect_highlight = " ts_headline('pali_unaccent', content,
+                    $param[] = $key;
+                $querySelect_highlight = " ts_headline('pali_unaccent', content,
                         websearch_to_tsquery('pali_unaccent', ?),
                         'StartSel = ~~, StopSel = ~~,MaxWords=3500, MinWords=3500,HighlightAll=TRUE')
                         AS highlight,";
-                $queryWhere = " full_text_search_weighted_unaccent @@ websearch_to_tsquery('pali_unaccent', ?) ";
-                $key = Tools::getWordEn($key);
-                $param = [$key,$key,$key];
+                $param[] = $key;
                 break;
         }
-
+        $_queryWhere = $this->getQueryWhere($request->get('key'),$request->get('match','case'));
+        $queryWhere = $_queryWhere['query'];
+        $param = array_merge($param,$_queryWhere['param']);
 
         $querySelect_2 = "  book,paragraph,content ";
 
         $queryCount = "SELECT count(*) as co FROM fts_texts WHERE {$queryWhere} {$queryBookId};";
-        $resultCount = DB::select($queryCount, $key);
+        $resultCount = DB::select($queryCount, $_queryWhere['param']);
 
         $limit = $request->get('limit',10);
         $offset = $request->get('offset',0);
@@ -167,54 +121,84 @@ class SearchController extends Controller
     public function book_list(Request $request){
         $searchChapters = [];
         $searchBooks = [];
-        $searchBookId = [];
         $queryBookId = '';
 
         if($request->has('tags')){
             //查询搜索范围
             $tags = explode(',',$request->get('tags'));
-            $tagIds = Tag::whereIn('name',$tags)->select('id')->get();
-            $paliTextIds = TagMap::where('table_name','pali_texts')->whereIn('tag_id',$tagIds)->select('anchor_id')->get();
-            $paliPara=[];
-            foreach ($paliTextIds as $key => $value) {
+            $queryBookId = ' AND pcd_book_id in ('.implode(',',$this->getBookIdByTags($tags)).') ';
+        }
+        $key = $request->get('key');
+
+        $queryWhere = $this->getQueryWhere($key,$request->get('match','case'));
+
+        $query = "SELECT pcd_book_id, count(*) as co FROM fts_texts WHERE {$queryWhere['query']} {$queryBookId} GROUP BY pcd_book_id ORDER BY co DESC;";
+        $result = DB::select($query, $queryWhere['param']);
+
+        return $this->ok(["rows"=>SearchBookResource::collection($result),"count"=>count($result)]);
+    }
+
+    private function getQueryWhere($key,$match){
+        $key = explode(';',$key) ;
+        $param = [];
+        $queryWhere = '';
+        switch ($match) {
+            case 'complete':
+            case 'case':
                 # code...
-                if(isset($paliPara[$value->anchor_id])){
-                    $paliPara[$value->anchor_id]++;
-                }else{
-                    $paliPara[$value->anchor_id]=1;
-                }
+                $queryWhereBase = " full_text_search_weighted @@ websearch_to_tsquery('pali', ?) ";
+                $queryWhereBody = implode(' or ', array_fill(0, count($key), $queryWhereBase));
+                $queryWhere = " ({$queryWhereBody}) ";
+                $param = array_merge($param,$key);
+                break;
+            case 'similar':
+                # 形似,去掉变音符号
+                $queryWhere = " full_text_search_weighted_unaccent @@ websearch_to_tsquery('pali_unaccent', ?) ";
+                $key = Tools::getWordEn($key[0]);
+                $param = [$key];
+                break;
+        };
+        return (['query'=>$queryWhere,'param'=>$param]);
+    }
+
+    private function getBookIdByTags($tags){
+        $searchBookId = [];
+        if(empty($tags)){
+            return $searchBookId;
+        }
+
+        //查询搜索范围
+        $tagIds = Tag::whereIn('name',$tags)->select('id')->get();
+        $paliTextIds = TagMap::where('table_name','pali_texts')->whereIn('tag_id',$tagIds)->select('anchor_id')->get();
+        $paliPara=[];
+        foreach ($paliTextIds as $key => $value) {
+            # code...
+            if(isset($paliPara[$value->anchor_id])){
+                $paliPara[$value->anchor_id]++;
+            }else{
+                $paliPara[$value->anchor_id]=1;
             }
-            $paliId=[];
-            foreach ($paliPara as $key => $value) {
-                # code...
-                if($value===count($tags)){
-                    $paliId[] = $key;
-                }
+        }
+        $paliId=[];
+        foreach ($paliPara as $key => $value) {
+            # code...
+            if($value===count($tags)){
+                $paliId[] = $key;
             }
-            $para = PaliText::where('level',1)->whereIn('uid',$paliId)->get();
-            Log::info($para);
+        }
+        $para = PaliText::where('level',1)->whereIn('uid',$paliId)->get();
 
-            if(count($para)>0){
-                foreach ($para as $key => $value) {
-                    # code...
-                    $book_id = BookTitle::where('book',$value['book'])->where('paragraph',$value['paragraph'])->value('id');
-                    if(!empty($book_id)){
-                        $searchBookId[] = $book_id;
-                    }
-                    $searchChapters[] = ['book'=>$value['book'],'paragraph'=>$value['paragraph']];
+        if(count($para)>0){
+            foreach ($para as $key => $value) {
+                # code...
+                $book_id = BookTitle::where('book',$value['book'])->where('paragraph',$value['paragraph'])->value('id');
+                if(!empty($book_id)){
+                    $searchBookId[] = $book_id;
                 }
-                $queryBookId = ' AND pcd_book_id in ('.implode(',',$searchBookId).') ';
             }
         }
-        $key = $request->get('key');
+        return $searchBookId;
 
-        $queryWhere = "( full_text_search_weighted @@ websearch_to_tsquery('pali', ?) OR
-        full_text_search_weighted_unaccent @@ websearch_to_tsquery('pali_unaccent', ?) )";
-
-        $query = "SELECT pcd_book_id, count(*) as co FROM fts_texts WHERE {$queryWhere} {$queryBookId} GROUP BY pcd_book_id ORDER BY co DESC;";
-        $result = DB::select($query, [$key,$key]);
-
-        return $this->ok(["rows"=>SearchBookResource::collection($result),"count"=>count($result)]);
     }
     /**
      * Store a newly created resource in storage.