1.视图
search/index.php
@extends('theme::layout.public') @section('seo_title')搜索 - 第{{ $list->currentPage() }}页 - {{ Setting()->get('website_name') }}@endsection @section('content') @if(Setting()->get("xunsearch_open",0)) <div class="container mt-20"> <div class="row"> <div class="container"> <ul class="search-category nav nav-pills"> <li @if($filter==='all') class="active" @endif ><a href="{{ route('auth.search.index') }}?word={{ $word }}">全部</a></li> <li @if($filter==='questions') class="active" @endif ><a href="{{ route('auth.search.index',['filter'=>'questions']) }}?word={{ $word }}">问答</a></li> <li @if($filter==='articles') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'articles']) }}?word={{ $word }}">文章</a></li> <li @if($filter==='courses') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'courses']) }}?word={{ $word }}">讲堂</a></li> <li @if($filter==='tags') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'tags']) }}?word={{ $word }}">话题</a></li> <li @if($filter==='goods') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'goods']) }}?word={{ $word }}">商品</a></li> <li @if($filter==='users') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'users']) }}?word={{ $word }}">用户</a></li> </ul> <form action="{{ route('auth.search.index',['filter'=>$filter]) }}" class="row" method="GET"> <div class="col-md-9"> <input class="input-lg form-control" type="text" name="word" value="{{ $word }}" placeholder="输入关键字搜索"> </div> <div class="col-md-2"> <button type="submit" class="btn btn-primary btn-lg btn-block search-btn">搜索</button> </div> </form> </div> </div> <div class="row"> <div class="col-md-9 main search-result"> <h3 class="h5">找到约 <strong>{{ $list->count() }}</strong> 条结果</h3> @foreach( $list as $item ) @if( $item['class_uid'] === 'a071d30e96787d46b4e6e5191b452c1d' ) <section class="widget-item"> <h2 class="h4"> @if( $item['status'] == 2 ) <span class="label label-success pull-left mr-5">问题</span> @else <span class="label label-warning pull-left mr-5">问题</span> @endif <a href="{{ route('ask.question.detail',['question_id'=>$item['id']]) }}" target="_blank">{!! $item['subject'] !!}</a> </h2> <p class="excerpt">{!! $item['content'] !!}</p> </section> @elseif( $item['class_uid'] === 'db04ed18cd04b43c64ab9d592dbebc40' ) <section class="widget-item"> <h2 class="h4"> <span class="label label-success pull-left mr-5">文章</span> <a href="{{ route('blog.article.detail',['article_id'=>$item['id']]) }}" target="_blank">{!! $item['subject'] !!}</a> </h2> <p class="excerpt">{!! $item['content'] !!}</p> </section> @elseif( $item['class_uid'] === 'dd1dbb9c9e9da2c2ef7ae392b218ecab' ) <section class="widget-item"> <h2 class="h4"> <span class="label label-success pull-left mr-5">商品</span> <a href="{{ route('shop.goods.detail',['id'=>$item['id']]) }}" target="_blank">{!! $item['subject'] !!}</a> </h2> <p class="excerpt">{!! $item['content'] !!}</p> </section> @elseif( $item['class_uid'] === '7c4b2df66ec878ccfab0c03ed7f61989' ) <section class="widget-item"> <h2 class="h4"> <span class="label label-success pull-left mr-5">用户</span> <a href="{{ route('auth.space.index',['user_id'=>$item['id']]) }}" target="_blank">{!! $item['subject'] !!}</a> </h2> <p class="excerpt">{!! $item['content'] !!}</p> </section> @elseif( $item['class_uid'] === '7118e6ddaa8fea122e7df7a9b79fc104' ) <section class="widget-item"> <h2 class="h4"> <span class="label label-default pull-left mr-5">话题</span> <a href="{{ route('ask.tag.index',['id'=>$item['id']]) }}" target="_blank">{!! $item['subject'] !!}</a> </h2> <p class="excerpt">{!! $item['content'] !!}</p> </section> @elseif( $item['class_uid'] === '0cbb2dbe0943b26c88809cee41ce8e8c' ) <section class="widget-item"> <h2 class="h4"> <span class="label label-success pull-left mr-5">讲堂</span> <a href="{{ route('live.course.show',['id'=>$item['id']]) }}" target="_blank">{!! $item['subject'] !!}</a> </h2> <p class="excerpt">{!! $item['content'] !!}</p> </section> @endif @endforeach <div class="text-center"> {!! str_replace('/?', '?', $list->render()) !!} </div> </div> <div class="col-md-3 side"></div> </div> </div> @else <div class="container mt-20"> <div class="row"> <div class="container"> <ul class="search-category nav nav-pills"> <li @if($filter==='questions') class="active" @endif ><a href="{{ route('auth.search.index',['filter'=>'questions']) }}?word={{ $word }}">问答</a></li> <li @if($filter==='articles') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'articles']) }}?word={{ $word }}">文章</a></li> <li @if($filter==='courses') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'courses']) }}?word={{ $word }}">讲堂</a></li> <li @if($filter==='tags') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'tags']) }}?word={{ $word }}">话题</a></li> <li @if($filter==='goods') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'goods']) }}?word={{ $word }}">商品</a></li> <li @if($filter==='users') class="active" @endif><a href="{{ route('auth.search.index',['filter'=>'users']) }}?word={{ $word }}">用户</a></li> </ul> <form action="{{ route('auth.search.index') }}" class="row" method="GET"> <div class="col-md-9"> <input class="input-lg form-control" type="text" name="word" value="{{ $word }}" placeholder="输入关键字搜索"> </div> <div class="col-md-2"> <button type="submit" class="btn btn-primary btn-lg btn-block search-btn">搜索</button> </div> </form> </div> </div> <div class="row"> <div class="col-md-9 main search-result"> <h3 class="h5 mt0">找到约 <strong>{{ $list->count() }}</strong> 条结果</h3> @if($filter==='questions') @foreach($list as $question) <section class="widget-question"> <h2 class="h4"> @if($question->status==2) <span class="label label-success pull-left mr-5">解决</span> @endif <a href="{{ route('ask.question.detail',['question_id'=>$question->id]) }}" target="_blank">{!! $question->title !!}</a> </h2> <p class="excerpt">{!! str_limit(strip_tags($question->description,"<em>"),200) !!} </p> </section> @endforeach @elseif($filter==='articles') @foreach($list as $article) <section class="widget-blog"> <h2 class="h4"> <a href="{{ route('blog.article.detail',['article_id'=>$article->id]) }}" target="_blank">{{ $article->title }}</a> </h2> <p class="excerpt">{{ str_limit(strip_tags($article->summary),200) }}</p> </section> @endforeach @elseif($filter==='users') @foreach($list as $user) <section class="widget-member"> <h2 class="h4"> <a href="{{ route('auth.space.index',['user_id'=>$user->id]) }}" target="_blank">{{ $user->name }}</a> @if($user->title) <span class="text-muted"> - {{ $user->title }}</span> @endif </h2> <p class="excerpt">{{ str_limit(strip_tags($user->description),200) }}</p> </section> @endforeach @elseif($filter==='tags') @foreach($list as $tag) <section class="widget-tag"> <h2 class="h4"> <a href="{{ route('ask.tag.index',['id'=>$tag->id]) }}" target="_blank">{{ $tag->name }}</a> </h2> <p class="excerpt">{{ str_limit(strip_tags($tag->description),200) }}</p> </section> @endforeach @elseif($filter==='courses') @foreach($list as $course) <section class="widget-tag"> <h2 class="h4"> <a href="{{ route('live.course.show',['id'=>$course->id]) }}" target="_blank">{{ $course->title }}</a> </h2> <p class="excerpt">{{ str_limit(strip_tags($course->description),200) }}</p> </section> @endforeach @elseif($filter==='goods') @foreach($list as $goods) <section class="widget-tag"> <h2 class="h4"> <a href="{{ route('shop.goods.detail',['id'=>$goods->id]) }}" target="_blank">{{ $goods->name }}</a> </h2> <p class="excerpt">{{ str_limit(strip_tags($goods->description),200) }}</p> </section> @endforeach @endif <div class="text-center"> {!! str_replace('/?', '?', $list->appends(['word'=>$word])->links()) !!} </div> </div> <div class="col-md-3 side"> <ul class="list-unstyled"> </ul> </div> </div> </div> @endif @endsection
search/show.php
@extends('theme::layout.public') @section('seo_title')搜索 - {{ Setting()->get('website_name') }}@endsection @section('content') <div class="container mt-20"> <div class="row"> <div class="container"> <ul class="search-category nav nav-pills"> @if(Setting()->get("xunsearch_open",0)) <li @if($filter==='all') class="active" @endif ><a href="{{ route('auth.search.index') }}?filter={{$filter}}&word={{ $word }}">全部</a></li> @endif <li @if($filter==='questions') class="active" @endif ><a href="{{ route('auth.search.index') }}?filter={{$filter}}&word={{ $word }}">问答</a></li> <li @if($filter==='articles') class="active" @endif><a href="{{ route('auth.search.index') }}?filter={{$filter}}&word={{ $word }}">文章</a></li> <li @if($filter==='tags') class="active" @endif><a href="{{ route('auth.search.index') }}?filter={{$filter}}&word={{ $word }}">标签</a></li> <li @if($filter==='goods') class="active" @endif><a href="{{ route('auth.search.index') }}filter={{$filter}}&?word={{ $word }}">商品</a></li> <li @if($filter==='users') class="active" @endif><a href="{{ route('auth.search.index') }}?filter={{$filter}}&word={{ $word }}">用户</a></li> </ul> <form action="{{ route('auth.search.index',['filter'=>$filter]) }}" class="row" method="GET"> <div class="col-md-9"> <input class="input-lg form-control" type="text" name="word" value="{{ $word }}" placeholder="输入关键字搜索" /> </div> <div class="col-md-2"> <button type="submit" class="btn btn-primary btn-lg btn-block search-btn">搜索</button> </div> </form> </div> </div> <div class="row"> <div class="col-md-9 main search-result"> </div> <div class="col-md-3 side"> <ul class="list-unstyled"> </ul> </div> </div> </div> @endsection
2.路由
/*全局搜索*/ Route::get('search/show',['as'=>'auth.search.show','uses'=>'SearchController@show']); Route::any('search/{filter?}',['as'=>'auth.search.index','uses'=>'SearchController@index'])->where(['filter'=>'(all|questions|articles|tags|users|courses|goods)']);
3.配置文件
config/xunsearch.php
\App\Models\Goods::class => [ 'fields' => [ 'name' => [ 'search_field' => 'subject', ], 'description' => [ 'search_field' => 'content', ], 'status' => [ 'search_field' => 'status', ], ], 'primary_key' => 'id' ],
4.控制器
app/Http/Controller/Account/SearchController.php
<?php namespace App\Http\Controllers\Account; use App\Models\Question; use App\Models\XsSearch; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Validator; use Illuminate\Pagination\LengthAwarePaginator as Paginator; class SearchController extends Controller { public function show(Request $request){ $word = trim($request->input('word')); $filter = trim($request->input('filter')); return view('theme::search.show')->with(compact('word','filter')); } /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index(Request $request,$filter='all') { $validator = Validator::make($request->all(), [ 'word' => 'required|max:128', ]); if ($validator->fails()) { return $this->error(route('auth.search.show'),'搜索关键词不能为空'); } $word = trim($request->input('word')); if( Setting()->get('xunsearch_open',0) == 1 ){ $pageSize = 15; $page = $request->query('page',1); $startIndex = ($page - 1) * $pageSize; $xsSearch = XsSearch::getSearch(); if($filter !== 'all'){ if($filter === 'goods'){ $model = App::make('App\Models\\'.ucfirst($filter)); }else{ $model = App::make('App\Models\\'.ucfirst(str_singular($filter))); } if($filter !== 'tags' ){ $docs = $xsSearch->model($model)->addQuery($word)->setLimit($pageSize,$startIndex)->search(); }else{ $docs = $xsSearch->model($model)->addQuery($word)->addRange('status',0,null)->setLimit($pageSize,$startIndex)->search(); } }else{ $docs = $xsSearch->addQuery($word)->setLimit($pageSize,$startIndex)->search(); } dd($docs); $dataList = []; foreach($docs as $doc){ $data = []; $data['class_uid'] = $doc->class_uid; $data['id'] = $doc->id; $data['status'] = $doc->status; $data['subject'] = XsSearch::getSearch()->highlight($doc->subject); $data['content'] = XsSearch::getSearch()->highlight($doc->content); $dataList[] = $data; } $total = $xsSearch->count(); $list = new Paginator($dataList, $total, $pageSize, $page,[ 'path' => $request->url(), 'query' => $request->query() ]); }else{ if($filter === 'all'){ $filter = 'questions'; } if($filter === 'goods'){ $model = App::make('App\Models\\'.ucfirst($filter)); }else{ $model = App::make('App\Models\\'.ucfirst(str_singular($filter))); } $list = $model::search($word); if($filter === 'questions'){ $list->map(function($item) use ($word) { foreach (explode(" ", $word) as $k) { $item->title = $this->_highlight($k, $item->title); $item->description = $this->_highlight($k, $item->description); } }); } } return view('theme::search.index')->with('word',$word)->with('filter',$filter)->with('list',$list); } private function _highlight($word,$subject){ return str_ireplace("$word","<em>$word</em>",$subject); } }
5.非常重要的一步,不执行无法获取到商品的搜索结果
在后台xunsearch【重建索引】