php如何集成elasticsearch,PHP thinkphp6.0使用elasticsearch

PHP版elasticsearch的GitHub地址

通过composer安装

composer require elasticsearch/elasticsearch

示例代码

namespace app\controller;

use app\BaseController;

use Elasticsearch\ClientBuilder;

use think\App;

use think\facade\Db;

class Index extends BaseController

{

use TestTrait,TestTrait2;

private $client;

private $index_name;

private $type;

// 构造函数

public function __construct(App $app)

{

parent::__construct($app);

$params = array(

'127.0.0.1:9200'

);

$this->client = ClientBuilder::create()->setHosts($params)->build();

}

/**设置索引跟 类型

* @param string $index_name

* @param string $type

*/

public function set($index_name='index',$type='type'){

$this->index_name=$index_name;

$this->type=$type;

}

/**mysql涉及到搜索的数据插入文档

* @throws \think\db\exception\DataNotFoundException

* @throws \think\db\exception\DbException

* @throws \think\db\exception\ModelNotFoundException

*/

public function sync(){

$list=Db::name("test")->select();

foreach ($list as $k => $v) {

$r = $this->add_doc($v['id'],$v);

}

}

// 搜索

public function index(){

//设置索引跟类型

$this->set('ccc','bbb');

//创建索引

// $this->create_index();

//创建文档结构

$r=$this->create_mappings();

//获取文档结构,查看映射

$r=$this->get_mapping();

$this->sync();

//删除索引

//$this->delete_index();

$id=1;

//文档是否存在

$r=$this->exists_doc($id);

if($r===true){

//获取文档信息

$r= $this->get_doc($id);

//修改文档

$r=$this->update_doc($id,'name','小明3');

//删除文档

// $this->delete_doc($id);

}

$r = $this->search_doc("删库 别烦我");

// dd($r);

}

// 删除索引

public function delete_index()

{

$params = ['index' => $this->index_name];

return $this->client->indices()->delete($params);

}

// 创建索引

/**

* @return array|callable

*/

public function create_index()

{

// 只能创建一次

$params = [

'index' => $this->index_name,

'type' => $this->type,

'body'=>[]

];

return $this->client->index($params);

}

//获取文档

public function get_doc($id){

$params = [

'index' =>$this->index_name,

'type' => $this->type,

'id'=>$id

];

return $this->client->get($params);

}

// 创建文档模板

public function create_mappings() {

$params = [

'index' => $this->index_name,

'type' => $this->type,

'include_type_name' => true,//7.0以上版本必须有

'body' => [

'properties' => [

'id' => [

'type' => 'long', // 整型

],

'name' => [

//5.x以上已经没有string类型。如果需要分词的话使用text,不需要分词使用keyword。

'type' => 'text', // 字符串型

],

'profile' => [

'type' => 'text',

],

'age' => [

'type' => 'long',

],

'job' => [

'type' => 'text',

],

]

]

];

return $this->client->indices()->putMapping($params);

}

// 查看映射

public function get_mapping() {

$params = [

'index' => $this->index_name,

'type' => $this->type,

'include_type_name' => true,//7.0以上版本必须有

];

return $this->client->indices()->getMapping($params);

}

/**添加文档

* @param string $id

* @param array $doc 跟创建文档结构时properties的字段一致

* @return array|callable

*/

public function add_doc(string $id,array $doc) {

$params = [

'index' => $this->index_name,

'type' => $this->type,

'id' => $id,

'body' => $doc

];

return $this->client->index($params);

}

// 判断文档存在

public function exists_doc($id = 1) {

$params = [

'index' => $this->index_name,

'type' => $this->type,

'id' => $id

];

return $this->client->exists($params);

}

/**更新文档

* @param $id

* @param $key

* @param $value

* @return array|callable

*/

public function update_doc($id,$key,$value) {

// 可以灵活添加新字段,最好不要乱添加

$params = [

'index' => $this->index_name,

'type' => $this->type,

'id' => $id,

'body' => [

'doc' => [

$key => $value

]

]

];

return $this->client->update($params);

}

/**删除文档

* @param int $id

* @return array|callable

*/

public function delete_doc($id = 1) {

$params = [

'index' => $this->index_name,

'type' => $this->type,

'id' => $id

];

return $this->client->delete($params);

}

/**查询表达式搜索

* @param $keywords

* @param $from

* @param $size

* @return array

*/

public function search_doc1($keywords,$from,$size){

return [

'query' =>[

"match"=>[

//"name"=>$keywords, 或者

"name"=>[

'query' => $keywords,

'boost' => 3, // 权重

],

],

]

,

'from' => $from,

'size' => $size

];

}

/**短语搜索

* @param $keywords

* @param $from

* @param $size

* @return array

*/

public function search_doc3($keywords,$from,$size){

return [

'query' =>[

"match_phrase"=>[

//"name"=>$keywords, 或者

"name"=>[

'query' => $keywords,

'boost' => 3, // 权重

],

],

]

,

'from' => $from,

'size' => $size

];

}

/**高亮搜索

* @param string $keywords

* @param $from

* @param $size

* @return array

*/

public function search_doc4(string $keywords,$from,$size):array {

return [

'query' =>[

"match_phrase"=>[

//"name"=>$keywords, 或者

"name"=>[

'query' => $keywords,

'boost' => 3, // 权重

],

],

],

'highlight'=>[

"fields"=>[

//必须加object,要不然转json时,这里依然是数组,而不是对象

"name"=>(object)[]

]

],

'from' => $from,

'size' => $size

];

}

/**搜索结果增加分析

* @param string $keywords

* @param int $from

* @param int $size

* @return array

*/

public function search_doc5(string $keywords,int $from,int $size){

return [

'query' =>[

'bool' => [

//必须匹配

"must"=>[

"match"=>[

"profile"=>$keywords,

]

],

//应该匹配

'should' => [

[ 'match' => [

'profile' => [

'query' => $keywords,

'boost' => 3, // 权重

]]],

[ 'match' => [ 'name' => [

'query' => $keywords,

'boost' => 2,

]]],

],

//复杂的搜索 限制年龄大于25岁

'filter'=>[

"range"=>[

"age"=>["gt"=>25]

]

]

],

],

'highlight'=>[

"fields"=>[

//必须加object,要不然转json时,这里依然是数组,而不是对象

"name"=>(object)[]

]

],

'aggs'=>[

"result"=>[

//terms 桶 统计文档数量

"terms"=>[

"field"=>"age"

]

],

"avg"=>[

//avg 平均值

"avg"=>[

"field"=>"age"

]

],

"max"=>[

//max 最大值

"max"=>[

"field"=>"age"

]

],

"min"=>[

//avg 最小值

"min"=>[

"field"=>"age"

]

],

],

'from' => $from,

'size' => $size,

];

}

/**使用过滤器 filter

* @param $keywords

* @param $from

* @param $size

* @return array

*/

public function search_doc2($keywords,$from,$size){

return ['query' => [

'bool' => [

//必须匹配

"must"=>[

"match"=>[

"name"=>$keywords,

]

],

//应该匹配

'should' => [

[ 'match' => [

'profile' => [

'query' => $keywords,

'boost' => 3, // 权重

]]],

[ 'match' => [ 'name' => [

'query' => $keywords,

'boost' => 2,

]]],

],

//复杂的搜索 限制年龄大于25岁

'filter'=>[

"range"=>[

"age"=>["gt"=>25]

]

]

],

],

// 'sort' => ['age'=>['order'=>'desc']],

'from' => $from,

'size' => $size

];

}

/** 查询文档 (分页,排序,权重,过滤)

* @param $keywords

* @param int $from

* @param int $size

* @return array|callable

*/

public function search_doc($keywords,$from = 0,$size = 12) {

$query=$this->search_doc5($keywords,$from,$size);

$params = [

'index' => $this->index_name,

'type' => $this->type,

'body' => $query

];

return $this->client->search($params);

}

}

你可能感兴趣的:(php如何集成elasticsearch,PHP thinkphp6.0使用elasticsearch)