- 安装Elasticsearch客户端
首先需要通过Composer安装Elasticsearch PHP客户端,这里是7.0版本,
Elasticsearch用的是
Elasticsearch 7.17.x(最终维护版本)
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-17-10
(推荐生产环境使用,7.x 的最后一个稳定版)
javascript
composer require elasticsearch/elasticsearch:^7.0
我用的windows版本,解压后双击这个目录下的这个bat文件
在浏览器里打开地址: http://localhost:9200/
显示:
表示运行成功
- 配置Elasticsearch连接
在config.php或新建一个配置文件(如elasticsearch.php)中添加配置:
php
// config/elasticsearch.php
return [
'host' => [
'http://localhost:9200', // ES服务器地址
],
'retries' => 1, // 重试次数
'log_index' => 'tp5_logs', // 日志索引名称(可选)
];
- 创建服务类
创建一个服务类来封装Elasticsearch操作:
php
// application/common/service/ElasticsearchService.php
namespace app\common\service;
use Elasticsearch\ClientBuilder;
use think\Config;
class ElasticsearchService
{
private $client;
public function __construct()
{
$config = Config::get('elasticsearch');
$this->client = ClientBuilder::create()
->setHosts($config['host'])
->setRetries($config['retries'])
->build();
}
/**
* 创建索引
*/
public function createIndex($indexName, $mappings = [])
{
$params = [
'index' => $indexName,
'body' => [
'settings' => [
'number_of_shards' => 1,
'number_of_replicas' => 0
],
'mappings' => $mappings
]
];
return $this->client->indices()->create($params);
}
/**
* 添加/更新文档
*/
public function indexDocument($indexName, $id, $document)
{
$params = [
'index' => $indexName,
'id' => $id,
'body' => $document
];
return $this->client->index($params);
}
/**
* 搜索文档
*/
public function search($indexName, $query)
{
$params = [
'index' => $indexName,
'body' => [
'query' => $query
]
];
return $this->client->search($params);
}
/**
* 删除文档
*/
public function deleteDocument($indexName, $id)
{
$params = [
'index' => $indexName,
'id' => $id
];
return $this->client->delete($params);
}
// 其他Elasticsearch操作方法...
}
- 使用示例
创建索引
php
$es = new \app\common\service\ElasticsearchService();
$mappings = [
'properties' => [
'title' => [
'type' => 'text',
'analyzer' => 'ik_max_word',
'search_analyzer' => 'ik_max_word'
],
'content' => [
'type' => 'text',
'analyzer' => 'ik_max_word',
'search_analyzer' => 'ik_max_word'
],
'create_time' => [
'type' => 'date'
]
]
];
$result = $es->createIndex('articles', $mappings);
添加文档
php
$document = [
'title' => 'ThinkPHP5使用指南',
'content' => '这是一篇关于ThinkPHP5框架的使用教程...',
'create_time' => date('Y-m-d H:i:s')
];
$result = $es->indexDocument('articles', 1, $document);
搜索文档
php
$query = [
'match' => [
'title' => 'ThinkPHP5'
]
];
$result = $es->search('articles', $query);
- 高级用法
批量操作
php
public function bulk($params)
{
return $this->client->bulk($params);
}
// 使用示例
$params = ['body' => []];
$data = [
['id' => 1, 'title' => '文档1', 'content' => '内容1'],
['id' => 2, 'title' => '文档2', 'content' => '内容2']
];
foreach ($data as $item) {
$params['body'][] = [
'index' => [
'_index' => 'articles',
'_id' => $item['id']
]
];
$params['body'][] = [
'title' => $item['title'],
'content' => $item['content'],
'create_time' => date('Y-m-d H:i:s')
];
}
$result = $es->bulk($params);
复杂查询
php
$query = [
'bool' => [
'must' => [
['match' => ['title' => 'ThinkPHP']],
['range' => [
'create_time' => [
'gte' => '2023-01-01',
'lte' => '2023-12-31'
]
]]
]
]
];
$result = $es->search('articles', $query);
- 与模型结合
可以创建一个基础模型类继承Elasticsearch功能:
php
// application/common/model/BaseEsModel.php
namespace app\common\model;
use think\Model;
use app\common\service\ElasticsearchService;
class BaseEsModel extends Model
{
protected $esIndex;
protected $esType = '_doc';
protected $esService;
protected function initialize()
{
$this->esService = new ElasticsearchService();
}
public function esSearch($query, $from = 0, $size = 10, $sort = [])
{
$params = [
'index' => $this->esIndex,
'type' => $this->esType,
'body' => [
'query' => $query,
'from' => $from,
'size' => $size,
'sort' => $sort
]
];
return $this->esService->search($params);
}
// 其他Elasticsearch相关方法...
}
注意事项
确保Elasticsearch服务已启动并正常运行
生产环境建议使用连接池和负载均衡配置多个节点
对于中文搜索,建议安装IK分词插件
大型应用考虑使用队列异步处理索引更新
注意异常处理,网络问题可能导致连接失败
通过以上步骤,你可以在ThinkPHP5中成功集成Elasticsearch,实现高效的全文搜索功能。