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());