PHP使用elasticsearch
2020-05-27 本文已影响0人
懒人程序猿
Elasticsearch-php 的安装可参考:https://www.elastic.co/guide/cn/elasticsearch/php/current/_installation_2.html
使用Composer安装,安装时注意版本的对应。
创建一个php项目,在项目根目录下创建composer.json文件。内容如下:
{
"require": {
"elasticsearch/elasticsearch": "~6.0"
}
}
使用 composer 安装客户端:首先要用下面第一个命令来安装 composer.phar ,然后使用第二个命令来执行安装程序。composer 会自动下载所有的依赖,把下载的依赖存储在 /vendor/ 目录下,并且创建一个 autoloader
curl -s http://getcomposer.org/installer | php
php composer.phar install --no-dev
执行完上面的命令后,项目目录会出现以下几个文件及目录
composer.json
composer.lock
composer.phar
vendor
下面开始创建客户端与客户端操作,项目根目录中创建一个demo文件夹。
demo文件夹中创建一个Elastic类文件:Elastic.php,文件内容如下:
<?php
require '../vendor/autoload.php';
/**
* Class Elastic
*
*/
class Elastic
{
/*
private static $hosts = [
'127.0.0.1:9200', // IP + Port
'127.0.0.1:9201', // IP + Port
];
*/
// https安全认证,请参阅:https://www.elastic.co/guide/cn/elasticsearch/php/current/_security.html
// http安全认证,格式:http://username:password@host:port
private static $hosts = [
'http://username:password@es-cn-nif1o3szx0015qjus.public.elasticsearch.aliyuncs.com:9200',
];
private static $client;
/**
* @return \Elasticsearch\Client
*/
public static function client()
{
try {
if (empty(self::$client)) {
self::$client = Elasticsearch\ClientBuilder::create()->setHosts(self::$hosts)->build();
}
} catch (Exception $exception) {
var_dump($exception->getMessage());
}
return self::$client;
}
/**
* @return array
*/
public static function createIndex()
{
// 创建一个 demo 的索引
// 主切片数量1,副本切片数1
// 索引类型(_doc),elasticsearch7.0以后的版本不再支持定义type类型
// 设置title、content字段数据类型为text使用ik_max_word分词器,timeout字段数据类型为integer
// elasticsearch默认分词器为standard,ik分词需要安装插件。
// ik分词器有两种颗粒拆分,ik_smart: 会做最粗粒度的拆分、ik_max_word: 会将文本做最细粒度的拆分
$params = array(
'index' => 'demo',
'body' => array(
'settings' => array(
'number_of_shards' => 1,
'number_of_replicas' => 1
),
'mappings' => array(
'_doc' => array(
'_source' => array(
'enabled' => true
),
'properties' => array(
'title' => array(
'type' => 'text',
'analyzer' => 'ik_max_word'
),
'content' => array(
'type' => 'text',
'analyzer' => 'ik_max_word'
),
'timeout' => array(
'type' => 'integer'
)
)
)
)
)
);
/**
* elasticsearch7.0以后的版本
*
$params = array(
'index' => 'demo',
'body' => array(
'settings' => array(
'number_of_shards' => 1,
'number_of_replicas' => 1
),
'mappings' => array(
'_source' => array(
'enabled' => true
),
'properties' => array(
'title' => array(
'type' => 'text',
'analyzer' => 'ik_max_word'
),
'content' => array(
'type' => 'text',
'analyzer' => 'ik_max_word'
),
'timeout' => array(
'type' => 'integer'
)
)
)
)
);
*/
return self::client()->indices()->create($params);
}
/**
* @return array
*/
public static function deleteIndex()
{
$params = array(
'index' => 'demo'
);
return self::client()->indices()->delete($params);
}
/**
* @return array
*/
public static function putSettings()
{
// 修改分区副本数为1
// -1关闭索引刷新,可设置 '5s' 5秒、'15s' 15秒、'30s' 30秒...
$params = array(
'index' => 'demo',
'body' => array(
'settings' => array(
'number_of_replicas' => 1,
'refresh_interval' => '30s'
)
)
);
return self::client()->indices()->putSettings($params);
}
/**
* @return array
*/
public static function getSettings()
{
$params = array(
'index' => ['demo']
);
return self::client()->indices()->getSettings($params);
}
/**
* @return array
*/
public static function putMapping()
{
$params = array(
'index' => 'demo',
'type' => '_doc',
'body' => array(
'_doc' => array(
'_source' => array(
'enabled' => true
),
// analyzer 使用分词器一旦生成不可更改,这里是对新增的字段进行的设置
'properties' => array(
'news' => array(
'type' => 'text',
'analyzer' => 'ik_smart'
),
'news_title' => array(
'type' => 'text',
'analyzer' => 'ik_smart'
)
)
)
)
);
return self::client()->indices()->putMapping($params);
}
/**
* @return array
*/
public static function getMapping()
{
$params = array(
'index' => ['demo']
);
return self::client()->indices()->getMapping($params);
}
/**
* @return array
*/
public static function bulk()
{
$params = array();
for ($i = 0; $i < 100; $i++) {
$params['body'][] = array(
'index' => array(
'_index' => 'demo',
'_type' => '_doc'
)
);
$params['body'][] = array(
'title' => '科技的进步与创新,给我们带来了前所未有的体验',
'content' => '未来的科技发展会是什么样的呢',
'timeout' => $i,
'news' => '科技的进步与创新',
'news_title' => '未来的科技发展会是什么样的呢?给我们带来了前所未有的体验'
);
}
return self::client()->bulk($params);
}
/**
* @return array
*/
public static function index()
{
$params = array(
'index' => 'demo',
'type' => '_doc',
// 不提供id,会自动生成
// 'id' => 'ids-asd',
'body' => array(
'title' => '科技的进步与创新,给我们带来了前所未有的体验',
'content' => '未来的科技发展会是什么样的呢',
'timeout' => 100
)
);
return self::client()->index($params);
}
/**
* @return array
*/
public static function create()
{
$params = array(
'index' => 'demo',
'type' => '_doc',
'id' => 'ids-asd1p',
'body' => array(
'title' => '科技的进步与创新,给我们带来了前所未有的体验',
'content' => '未来的科技发展会是什么样的呢',
'timeout' => 100
)
);
return self::client()->create($params);
}
/**
* @return array
*/
public static function update()
{
// doc
$params = array(
'index' => 'demo',
'type' => '_doc',
'id' => 'FCDiUXIBaHckAWMH1vtU',
'body' => array(
'doc' => array(
'title' => '科技的进步与创新,给我们带来了前所未有的体验.更新了',
'content' => '未来的科技发展会是什么样的呢。更新了',
'timeout' => 100
)
)
);
return self::client()->update($params);
}
/**
* @return array
*/
public static function updateByQuery()
{
$params = array(
'index' => ['demo'],
'type' => ['_doc'],
'body' => array(
'query' => array(
'match' => array(
'title' => '科技'
)
),
'script' => array(
'source' => 'ctx._source.title=params.title;ctx._source.content=params.content;ctx._source.timeout=params.timeout;',
'params' => array(
'title' => '科技的进步与创新,给我们带来了前所未有的体验.更新了',
'content' => '未来的科技发展会是什么样的呢。更新了',
'timeout' => 100
)
)
)
);
return self::client()->updateByQuery($params);
}
/**
* @return array
*/
public static function delete()
{
$params = array(
'index' => 'demo',
'type' => '_doc',
'id' => 'KOetUXIBX-ZyL96-un8s'
);
return self::client()->delete($params);
}
public static function deleteByQuery()
{
$params = array(
'index' => ['demo'],
'type' => ['_doc'],
'body' => array(
'query' => array(
'match' => array(
'title' => '科技'
)
)
)
);
return self::client()->deleteByQuery($params);
}
/**
* @return array
*/
public static function get()
{
$params = array(
'id' => 'PecKSHIBX-ZyL96-ywQO',
'index' => 'demo',
'type' => '_doc'
);
return self::client()->get($params);
}
/**
* @return array
*/
public static function search()
{
$params = array(
'index' => 'demo',
'type' => '_doc',
'body' => array(
// query 查询
'query' => array(
'match' => array(
'title' => '科技'
)
),
// 高亮
'highlight' => array(
"pre_tags" => ["<font color='red'>"],
"post_tags" => ["</font>"],
'fields' => array(
'title' => new \stdClass()
)
)
),
'from' => 1,
'size' => 2
);
return self::client()->search($params);
}
}
// var_dump('<pre>', Elastic::createIndex());
// var_dump('<pre>', Elastic::deleteIndex());
// var_dump('<pre>', Elastic::putSettings());
// var_dump('<pre>', Elastic::getSettings());
// var_dump('<pre>', Elastic::getMapping());
// var_dump('<pre>', Elastic::putMapping());
// var_dump('<pre>', Elastic::bulk());
// var_dump('<pre>', Elastic::index());
// var_dump('<pre>', Elastic::create());
// var_dump('<pre>', Elastic::update());
// var_dump('<pre>', Elastic::updateByQuery());
// var_dump('<pre>', Elastic::delete());
// var_dump('<pre>', Elastic::deleteByQuery());
// var_dump('<pre>', Elastic::get());
// var_dump('<pre>', Elastic::search());
创建索引
Elastic::createIndex();
删除索引
Elastic::deleteIndex();
动态设置索引设置项
Elastic::putSettings();
获取索引设置
Elastic::getSettings();
获取索引映射设置
Elastic::getMapping();
设置索引映射项
Elastic::putMapping();
批量添加文档
Elastic::bulk();
新增文档,当索引不存在的情况下会自动创建一个。不传id会自动生成一个id
Elastic::index();
新增文档,create需要设置id
Elastic::create();
通过id更新文档
Elastic::update();
通过匹配条件更新文档
Elastic::updateByQuery();
根据id删除文档
Elastic::delete();
通过匹配条件删除文档
Elastic::deleteByQuery();
通过id获取文档
Elastic::get();
搜索文档
Elastic::search();