PHP 中使用 ElasticSearch 的最佳实践

引言

PHP 开发者其实使用到 ES 的情况并不多,因为开发的大多数项目可能都没有快速模糊搜索的需求。

即使有这样的需求,用 MySQL 的 like 查询,就基本可以搞定需求了。

也就没有必要杀鸡用宰牛刀,使用 ES 了。

正是在这种情况下,导致很多的 PHP 开发者都没有接触过 ES。

即使有一些对 ES 有兴趣的,也因为 ES 中文文档的缺乏,而放弃了。

因此,接下来的这篇文章就类比 MySQL 来使用 ES,让大多数的 PHP 开发者能使用起 ES 来。

注:ElasticSearch 在文中简称 ES。

实现思路

我先简单的描述一下需求:

实现一个商品的搜索功能,只要含有搜索关键字词的就匹配,并且按照发布时间和价格倒序。

我这里已经安装好 MySQL 和 ES 了。如果没有安装的同学,可以先自行安装。

先在 MySQL 中创建一张数据表 product,建表语句如下:

CREATE TABLE `product` (
`id` int(11) UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '商品 ID',
`title` varchar(64) NOT NULL DEFAULT '' COMMENT '商品名称',
`long_title` varchar(64) NOT NULL DEFAULT '' COMMENT '商品长名称',
`sku` varchar(32) NOT NULL DEFAULT '' COMMENT '商品 SKU',
`price` decimal(4, 2) NOT NULL DEFAULT 0 COMMENT '商品价格',
`sales` int(11) NOT NULL DEFAULT 0 COMMENT '商品销量',
`created_at` datetime COMMENT '创建时间',
`updated_at` datetime COMMENT '修改时间'
) ENGINE = InnoDB CHARACTER SET = utf8mb4;

然后对应在 ES 中创建索引 product

// 创建索引并定义属性
PUT http://127.0.0.1/product {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"product_id": {
"type": "integer"
},
"title" : {
"type": "text"
},
"long_title" : {
"type": "text"
},
"sku": {
"type": "text"
},
"price": {
"type": "double"
},
"sales": {
"type": "integer"
},
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || epoch_millis"
},
"updated_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || epoch_millis"
}
}
}
}

创建好索引之后,我们就从 MySQL 将数据同步到 ES,同步的方案有如下三种:

1、可以直接在存储入 MySQL 之后,就直接写入 ES。

2、通过 Logstash 定时,从 MySQL 数据库中拉取数据同步到 ES。

3、可以通过第三方中间件(例如:canal、go-mysql-elasticsearch),拉取 MySQL 的 binlog 日志,之后中间件解析日志将数据同步到 ES。

创建好索引和添加数据之后,在业务的发展过程中,可能会增加字段。

这里增加一个 description 字段。

现在 MySQL 中增加字段到 product 数据表。

alter table `product` add column description varchar(255) default "" comment "商品描述";

然后向 ES 中的 product 索引,增加属性字段。

// 增加映射字段
// http://127.0.0.1:9200/product/_mapping
{
"properties": {
"description": {
"type": "text"
}
}
}

业务发展到中后时期的时候,可能发现字段越来越多了,这个时候想要删除一些字段。

但是,在 ES 中的 Mapping 中是不能直接删除字段的,只能重新创建。

很多情况,我们还是不建议去删除字段,因为这会增加很多不必要的成本以及带来的风险。

如果,为了节省存储空间,Boss 一定要删除字段。那就按照下面的方法,也是可以实现的。

1、创建一个新的索引

2、创建新的映射关系 mapping

3、将原索引的数据到入到新索引

4、新索引创建原索引一致的别名

5、删除原索引

下一篇文章,我将会介绍如何在 laravel 框架中使用 ES。

PHP 中使用 ElasticSearch 的最佳实践(上)的更多相关文章

  1. 在objc项目中使用常量的最佳实践

    在objc项目中使用常量的最佳实践   之前,在在objc项目中使用常量中,使用c的预处理#define来设置常量.比如,可以做个头文件,然后在需要的类文件中import,使用常量. 但这不是最佳实践 ...

  2. 在Flask中使用Celery的最佳实践

    写在前面 本最佳实践是基于作者有限的经验,欢迎大家共同讨论,可以持续维护此最佳实践.另本文中所使用的环境为Mac&Ubuntu环境,软件版本如下: Celery (4.1.0) Flask ( ...

  3. Kafka在大型应用中的 20 项最佳实践

    原标题:Kafka如何做到1秒处理1500万条消息? Apache Kafka 是一款流行的分布式数据流平台,它已经广泛地被诸如 New Relic(数据智能平台).Uber.Square(移动支付公 ...

  4. 教程 - 在 Vue3+Ts 中引入 CesiumJS 的最佳实践@2023

    目录 1. 本篇适用范围与目的 1.1. 适用范围 1.2. 目的 2. 牛刀小试 - 先看到地球 2.1. 创建 Vue3 - TypeScript 工程并安装 cesium 2.2. 清理不必要的 ...

  5. 说出几点 Java 中使用 Collections 的最佳实践?

    这是我在使用 Java 中 Collectionc 类的一些最佳实践: a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector. b)优先使用并发集合,而不是对 ...

  6. 说出几条 Java 中方法重载的最佳实践?

    下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱. a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参 数. b)不要重载参数数量一致,而只是参数顺序 ...

  7. 同步mysql数据到ElasticSearch的最佳实践

    Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据.ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全 ...

  8. reactjs中props和state最佳实践

    http://blog.csdn.net/dangnian/article/details/50998981

  9. 虚拟机最佳实践:单个 VM、临时存储和已上传磁盘

    大家好! 我是 Drew McDaniel,来自 Microsoft Azure虚拟机功能研发团队,我从团队成立之初就已加入. 在本博客文章中,我将分享一些最佳实践指南,帮助您充分利用您的Azure虚 ...

  10. 【转】Java中关于异常处理的十个最佳实践

    原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...

随机推荐

  1. 【原创】win11完美搭建macos13实现IOS自动化测试环境

    虚拟机完美搭建IOS自动化测试环境 一.win系统 1.1 安装虚拟机VM16 如果是macos系统请跳过 详细安装请看压缩包,私信可以提供安装包 1.2 VM解锁macOS 使用的是unlocker ...

  2. 重新整理数据结构与算法(c#)—— 二叉树排序树[二十二]

    前言 什么是二叉堆排序呢? 就是上面这种,一个节点大于左节点,但是小于右节点,再我写的例子中会写出大于等于右节点. 那么如何让一个数组进行变成这种二叉树呢? 其实只要有规律就很简单. 第一个元素(0) ...

  3. 使用mmdetection训练自己的coco数据集(免费分享自制数据集文件)

    首先需要准备好数据集,这里有labelme标签数据转coco数据集标签的说明:labelme转coco数据集 - 一届书生 - 博客园 (cnblogs.com) 1. 准备工作目录 我们的工作目录, ...

  4. Linux命令之查找CPU资源利用情况(lscpu和top详解)

    1.lscpu命令:获取CPU架构完整详细信息,例如架构信息,CPU模式,CPU频率,CPU核心数.线程数.缓存大小. 在终端输入"lscpu": 参数详解: [Architect ...

  5. 力扣977(Java)-有序数组的平方(简单)

    题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4,-1,0,3,10]输出:[0,1, ...

  6. OPLG:新一代云原生可观测最佳实践

    ​简介:OPLG 体系拥有成熟且富有活力的开源社区生态,同时也经过了大量企业生产环境的实践检验,是当下建设新一代云原生统一可观测平台的热门选择.但是,OPLG 只是提供了一个技术体系,如何灵活运用,解 ...

  7. 如何落地云原生DevOps?

    简介: 什么是云原生DevOps?在阿里内部有怎样的实践?企业又该如何落地?阿里云云效专家团队提出了下一代精益产品开发方法体系--ALPD,提供了系统的云原生DevOps落地的方法支撑,帮助企业渐进式 ...

  8. 选轻量应用服务器or云服务器ECS?一图帮你彻底区分

    简介:轻量应用服务器适合轻量级且访问量低的应用场景,更适合个人开发者.对新手小白更友好:而云服务器ECS可覆盖全业务场景(如大数据分析,深度学习等),要求用户有一定的开发技术能力. 本文首发于公众号& ...

  9. 【详谈 Delta Lake 】系列技术专题 之 特性(Features)

    简介: 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章.众所周知,Databricks 主导着开源大数据社区 Apache Spark.Delta L ...

  10. [FAQ] 适用于 macOS / Arm64 (M1/M2) 的 VisualBox

      使用与 Windows.Linux.macOS 的x86架构的一般在下面地址中下载: Download VisualBox:https://www.virtualbox.org/wiki/Down ...