Laravel/Tp5下通用ElasticSearch增删改查,高亮显示

ElasticSearch的前提 下载 : composer require elasticsearch/elasticsearch

 /**  提前声明 ElasticSearch 私有属性  方便以下使用
     * @var
     */
    private $es;


    /**     
     *
     * Uploads constructor.
     * @param Request|null $request
     */
    public function __construct(Request $request = null)
    {
        parent::__construct($request);
        //  这里是地址:127.0.0.1:9200  位于本机地址
        $hosts =  ['127.0.0.1:9200'];
        $this->es = ClientBuilder::create()->setHosts($hosts)->build();
    }

初始化 ElasticSearch,并生成索引,_doc为7.0后默认的类型,所以不用加,加的话报错

    public function ElasticSearch()
    {
        $params = [
            'index' => 'uploads',
            'body' => [
                'settings' => [
                    'number_of_shards' => 3,
                    'number_of_replicas' => 2
                ],
                'mappings' => [
//                    '_doc' => [		
                        '_source' => [
                            'enabled' => true
                        ],
                        'properties' => [
                            'music' => [
                                'type' => 'text',
                                'analyzer' => 'ik_max_word',
//                            'search_analyzer' => 'ik_max_word'
                            ],
                            'video' => [
                                'type' => 'text',
                            ]
                        ]
//                    ]
                ]
            ]
        ];
       $response  = $this->es->indices()->create($params);
       dd($response);
    }

添加ElasticSearch

    public function save(Request $request)
    {
        $param = $request->param();
        $model = \app\video\model\Uploads::create($param,true);
        // 写文档
        $params = [
            'index' => 'uploads',
            'type' => '_doc',
            'id' => $model->id,
            'body' => [
                'music' => $model->music,
                'video' => $model->video,

            ],
        ];
        $response = $this->es->index($params);
        dd($response);
    }

方法一:搜索并高亮显示 安装 composer require nunomaduro/collision 即可,为高亮做准备

    /**     
     * @param Request $request
     */
    public function search(Request $request)
    {
        $param = $request->param('music');
        $params = [
            'index' => 'uploads',
            'body'  => [
                'query' => [
                    'multi_match' => [
                        'query' => $param,
                        'fields' => ['music','video']
                    ]
                ],
                'highlight' => [
                    'fields' => [
                        "*" => new Highlighter()
                    ]
                ]
            ]
        ];
        $response = $this->es->search($params);
        $data  = array_column($response,"hits")[0];
       foreach ($data as $key => &$val){
           $source = $val['_source'];
           $source['id'] =  $val['_id'];
           $source['realname'] = $val['highlight']['realname'][0];
           $val=$source;
       }
        print_r($response);
    }

方法二:

public function search_doc($index_name = "test_ik", $type_name = "goods", $body = [])
    {

        $params = [
            'index' => $index_name,
            'type' => $type_name,
            'body' => $body
        ];
        $results = $this->es->search($params);
        return $results;
    }

    public function select_doc($index_name = "test_ik", $type_name = "goods")
    {
        $params = [
            'index' => $index_name,
            'type' => $type_name,
        ];

        $results = $this->es->search($params);
        return $results;
    }
    
    public function index(Request $request)
    {
        $value = input('title', '');
        $main = array_column($this->select_doc('test_index', '_doc'), 'hits');
        $main = array_column($main[0], '_source');
        if ($this->request->isPost() && !empty($value)) {
            $body = [
//                'index' => 'test_index',
//                'body' => [
                    'query' => [
                        'bool' => [
                            'should' => [
                                ['match' => ['title' => [
                                    'query' => $value,
                                    'boost' => 3, // 权重大
                                ]]],
                                ['match' => ['main' => [
                                    'query' => $value,
                                    'boost' => 5, // 权重大
                                ]]],
                            ],
                        ],
                    ],
                    'sort' => ['_id' => ['order' => 'desc']]     //排序   分页
                    , 'from' => 0, 'size' => 10
//                ]
            ];
     $main = array_column($this->search_doc('test_index', '_doc',$body), 'hits');
    $main = array_column($main[0], '_source');
     foreach ($main as $k => &$v) {
        $v['title'] = str_replace($value, "<em color='red'>$value</em>", $v['title']);
         $v['main'] = str_replace($value, "<em color='red'>$value</em>", $v['main']);
            }
        }
        return view('index', compact('main'));
    }

修改

    /**     
     * @param Request $request
     * @param $id
     */
    public function update(Request $request,$id)
    {
        $param = $request->param();
        $model = \app\video\model\Uploads::update($param,['id'=>$id],true);
        // 写文档
        $params = [
            'index' => 'uploads',
            'type' => '_doc',
            'id' => $model->id,
            'body' => [
                'music' => $model->music,
                'video' => $model->video,
            ],
        ];
        $response = $this->es->index($params);
        dd($response);
    }

删除

    public function delete(Request $request,$id)
    {
        //  进行删除数据
          \app\video\model\Uploads::destroy($id);
        $params = [
            'index' => 'uploads',
            'id'    => $id
        ];
        $response = $this->es->delete($params);
        dump($response);
    }

这里是我自己写的备注,请勿与上面一块粘贴

//	
		$name = $request->name;
        $data = Book::when($name, function ($query, $name) {
            $query->where('name','like', "%{$name}%");
        })->paginate(5)->appends($request->all());
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值