参考mysql的表结构与部分数据
laravel引入Elasticsearch
composer require elasticsearch/elasticsearch:7.16.0
1.ES初始化
use Elasticsearch\ClientBuilder;
private function _init_es()
{
$hosts = ['127.0.0.1:9200'];
$client = ClientBuilder::create()->setHosts($hosts)->build();
return $client;
}
- 创建索引
private function createIndex()
{
//初始化一个es
$client = $this->_init_es();
$params = [
'index' => 'article', //索引的名称(mysql的表名)
'body' => [
'settings' => [
'number_of_shards' => 5,//设置数据的分片数,默认为5
'number_of_replicas' => 0,//备份数,单个es服务器无需备份
],
'mappings' => [
'properties' => [
'id' => [
'type' => 'integer'
],
'title' => [
'type' => 'text', //text类型,做模糊搜索用
'analyzer'=>'ik_max_word',//较细粒度分词,写入数据用 需要安装ik并将ik放入es的plugin中
'search_analyzer'=>'ik_smart',//较细粒度分词,查询数据用 需要安装ik并将ik放入es的plugins中
],
'descs' => [
'type' => 'keyword' //keyword类型 做精确搜索用
],
],
],
],
];
$response = $client->indices()->create($params);
return $response;
}
- 写入数据
private function inserUpdate($data)
{
$client = $this->_init_es();
foreach ($data as &$item) {
$params = [
'index' => 'article',
'type' => '_doc',
'id' => $item->id,
'body' => [
'id' => $item->id,
'title' => $item->title,
'descs' => $item->descs,
],
];
$rs = $client -> index($params);
var_dump($rs);
}
// var_dump($rs);
return true;
}
- 查询数据
private function doSearch($keywords){
$esWhere = [];
//如果需要 同时满足多个查询条件(and查询),则复制下面参数,改title为 descs即可
$esWhere['bool']['must'][] = [
'match_phrase' => [
'title' =>$keywords
]
];
/*
$esWhere['bool']['must'][] = [
'match_phrase' => [
'descs' =>$keywords
]
];
*/
//按id排序
$sortOrder = ['id'=>'asc'];
$where = [
'index'=>'article',
'size'=>10,
'from'=>0,
'type'=>'_doc',
'body' => [
'query' =>$esWhere,//查询条件
'sort' =>$sortOrder,//排序条件,注意 添加后 返回结果 无_score值
'highlight' => [ //将查询的数据进行高亮显示
'fields' => [
'title' => [
'pre_tags' =>['<span style="color: red">'],
'post_tags' =>['</span>'],
]
]
]
]
];
$client = $this->_init_es();
$rs = $client->search($where);
return $rs;
}
5.删除数据
private function deleteData ($id) {
$client = $this->_init_es();
$client->delete(['index'=>'article', 'id'=>$id]);
}
- 删除索引
private function deleteIndex () {
$client = $this->_init_es();
$client->indices()->delete(['index'=>'article']);
}