当前位置: 首页 > news >正文

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 的最后一个稳定版)
composer require elasticsearch/elasticsearch:^7.0

我用的windows版本,解压后双击这个目录下的这个bat文件
在这里插入图片描述
在浏览器里打开地址: http://localhost:9200/
显示:在这里插入图片描述
表示运行成功

  1. 配置Elasticsearch连接
    在config.php或新建一个配置文件(如elasticsearch.php)中添加配置:
// config/elasticsearch.php
return ['host' => ['http://localhost:9200', // ES服务器地址],'retries' => 1, // 重试次数'log_index' => 'tp5_logs', // 日志索引名称(可选)
];
  1. 创建服务类
    创建一个服务类来封装Elasticsearch操作:
// 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. 使用示例
    创建索引
$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);

添加文档

$document = ['title' => 'ThinkPHP5使用指南','content' => '这是一篇关于ThinkPHP5框架的使用教程...','create_time' => date('Y-m-d H:i:s')
];
$result = $es->indexDocument('articles', 1, $document);

搜索文档

$query = ['match' => ['title' => 'ThinkPHP5']
];
$result = $es->search('articles', $query);
  1. 高级用法
    批量操作
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);

复杂查询

$query = ['bool' => ['must' => [['match' => ['title' => 'ThinkPHP']],['range' => ['create_time' => ['gte' => '2023-01-01','lte' => '2023-12-31']]]]]
];
$result = $es->search('articles', $query);
  1. 与模型结合
    可以创建一个基础模型类继承Elasticsearch功能:
// 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,实现高效的全文搜索功能。

http://www.dtcms.com/a/330374.html

相关文章:

  • 20. 了解过尾递归优化吗
  • ASCII与Unicode:编码世界的奥秘
  • TLS 终止在真实业务中的防护价值
  • 36 C++ STL模板库5-string
  • Python网络爬虫(二) - 解析静态网页
  • IPTV系统:开启视听与管理的全新篇章
  • CMake 如何查找 Python2和Python3
  • 利用 Python 爬虫按图搜索 1688 商品(拍立淘)实战指南
  • 17. 如何判断一个对象是不是数组
  • 肖臻《区块链技术与应用》第十一讲:比特币核心概念重温:一文读懂私钥、交易、挖矿与网络现状
  • Redis7学习——Redis的十大类型String、List、Hash、Set、Zset
  • 解决:Gazebo连接模型数据库失败
  • linux 内核 - 内存管理概念
  • Apifox精准定义复杂API参数结构(oneOf/anyOf/allOf)
  • aave v3 存款与借款利息的计算方式
  • 码上爬第七题【协程+参数加密+响应解密+格式化检测】
  • C#面试题及详细答案120道(11-20)-- 面向对象编程(OOP)
  • LeetCode Day5 -- 二叉树
  • 嵌入式学习(day26)frambuffer帧缓冲
  • 【系统安装】虚拟机中安装win10企业版系统记录
  • HarmonyOS 开发实战:搞定应用名字与图标更换,全流程可运行示例
  • 101、【OS】【Nuttx】【周边】文档构建渲染:reStructuredText 格式
  • 硬件工程师八月实战项目分享
  • AI抢饭碗,软件测试该何去何从?
  • 基于离散余弦变换的激活水印(DCT-AW)
  • 交错字符串-二维dp
  • 如何通过 Actor 网络压缩为概率分布实现
  • RK3568 Linux驱动学习——新字符设备驱动
  • 人工智能入门①:AI基础知识(上)
  • Vue3 vs Vue2:全面对比与面试宝典