tipask增加xunsearch商品搜索

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【重建索引】

猜你喜欢

转载自www.cnblogs.com/qjykn/p/10710426.html