tp5集成elasticsearch笔记

  1. 安装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/

显示:

表示运行成功

  1. 配置Elasticsearch连接
    在config.php或新建一个配置文件(如elasticsearch.php)中添加配置:
php 复制代码
// config/elasticsearch.php
return [
    'host' => [
        'http://localhost:9200', // ES服务器地址
    ],
    'retries' => 1, // 重试次数
    'log_index' => 'tp5_logs', // 日志索引名称(可选)
];
  1. 创建服务类
    创建一个服务类来封装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操作方法...
}
  1. 使用示例
    创建索引
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);
  1. 高级用法
    批量操作
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);
  1. 与模型结合
    可以创建一个基础模型类继承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,实现高效的全文搜索功能。

相关推荐
Coder_Boy_4 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934734 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
Gain_chance4 小时前
34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总
数据仓库·hive·笔记·学习·datagrip
九河云5 小时前
5秒开服,你的应用部署还卡在“加载中”吗?
大数据·人工智能·安全·机器学习·华为云
Gain_chance5 小时前
36-学习笔记尚硅谷数仓搭建-DWS层数据装载脚本
大数据·数据仓库·笔记·学习
肖永威6 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
每日新鲜事6 小时前
热销复盘:招商林屿缦岛203套售罄背后的客户逻辑分析
大数据·人工智能
暗光之痕6 小时前
Unreal5研究笔记 Actor的生命周期函数
笔记·unreal engine
Gain_chance6 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
AI架构全栈开发实战笔记7 小时前
Eureka 在大数据环境中的性能优化技巧
大数据·ai·eureka·性能优化