依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 18|回复: 0

基于MySQL与Elasticsearch集成的完整示例代码,包含商品表结构、数据同步逻辑和搜索功能实现

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
18415
发表于 8 小时前 | 显示全部楼层 |阅读模式
基于MySQL与Elasticsearch集成的完整示例代码,包含商品表结构、数据同步逻辑和搜索功能实现
关键实现要点说明:
MySQL表设计包含所有必要字段,updated_at字段用于增量同步‌
Elasticsearch映射配置了中文分词器(ik_max_word)支持中文搜索‌
同步方案采用全量+增量模式,可通过MySQL触发器实时调用‌
搜索功能支持关键词匹配和精确筛选组合查询
product.sql

  1. CREATE TABLE `products` (
  2.   `id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  3.   `name` VARCHAR(100) NOT NULL COMMENT '商品名称',
  4.   `price` DECIMAL(10,2) NOT NULL COMMENT '价格',
  5.   `attributes` TEXT COMMENT '属性JSON(支持关键词搜索)',
  6.   `category` VARCHAR(50) NOT NULL COMMENT '商品类型',
  7.   `is_sold` TINYINT(1) DEFAULT 0 COMMENT '是否售出',
  8.   `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码
es_index.php
  1. <?php
  2. require 'vendor/autoload.php';
  3. use Elasticsearch\ClientBuilder;

  4. $client = ClientBuilder::create()->setHosts(['localhost:9200'])->build();

  5. // 创建商品索引
  6. $params = [
  7.     'index' => 'products',
  8.     'body' => [
  9.         'settings' => [
  10.             'number_of_shards' => 1,
  11.             'number_of_replicas' => 0
  12.         ],
  13.         'mappings' => [
  14.             'properties' => [
  15.                 'name' => ['type' => 'text', 'analyzer' => 'ik_max_word'],
  16.                 'price' => ['type' => 'float'],
  17.                 'attributes' => ['type' => 'text', 'analyzer' => 'ik_max_word'],
  18.                 'category' => ['type' => 'keyword'],
  19.                 'is_sold' => ['type' => 'boolean']
  20.             ]
  21.         ]
  22.     ]
  23. ];
  24. $response = $client->indices()->create($params);
复制代码
sync.php
  1. <?php
  2. require 'vendor/autoload.php';
  3. use Elasticsearch\ClientBuilder;

  4. class ProductSync {
  5.     private $es;
  6.     private $pdo;
  7.    
  8.     public function __construct() {
  9.         $this->es = ClientBuilder::create()->setHosts(['localhost:9200'])->build();
  10.         $this->pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
  11.     }

  12.     // 全量同步
  13.     public function fullSync() {
  14.         $stmt = $this->pdo->query("SELECT * FROM products");
  15.         while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  16.             $this->syncToEs($row);
  17.         }
  18.     }

  19.     // 增量同步(通过触发器调用)
  20.     public function syncProduct($productId) {
  21.         $stmt = $this->pdo->prepare("SELECT * FROM products WHERE id = ?");
  22.         $stmt->execute([$productId]);
  23.         $row = $stmt->fetch(PDO::FETCH_ASSOC);
  24.         $this->syncToEs($row);
  25.     }

  26.     private function syncToEs($product) {
  27.         $params = [
  28.             'index' => 'products',
  29.             'id'    => $product['id'],
  30.             'body'  => [
  31.                 'name' => $product['name'],
  32.                 'price' => (float)$product['price'],
  33.                 'attributes' => $product['attributes'],
  34.                 'category' => $product['category'],
  35.                 'is_sold' => (bool)$product['is_sold']
  36.             ]
  37.         ];
  38.         $this->es->index($params);
  39.     }
  40. }

  41. // 使用示例
  42. $sync = new ProductSync();
  43. $sync->fullSync();
复制代码
search.php
  1. <?php
  2. require 'vendor/autoload.php';
  3. use Elasticsearch\ClientBuilder;

  4. class ProductSearch {
  5.     private $es;
  6.    
  7.     public function __construct() {
  8.         $this->es = ClientBuilder::create()->setHosts(['localhost:9200'])->build();
  9.     }

  10.     public function search($keyword, $filters = []) {
  11.         $must = [];
  12.         
  13.         // 关键词搜索(名称和属性)
  14.         if (!empty($keyword)) {
  15.             $must[] = [
  16.                 'multi_match' => [
  17.                     'query'  => $keyword,
  18.                     'fields' => ['name^3', 'attributes']
  19.                 ]
  20.             ];
  21.         }

  22.         // 精确筛选
  23.         foreach ($filters as $field => $value) {
  24.             if (!empty($value)) {
  25.                 $must[] = ['term' => [$field => $value]];
  26.             }
  27.         }

  28.         $params = [
  29.             'index' => 'products',
  30.             'body'  => [
  31.                 'query' => [
  32.                     'bool' => ['must' => $must]
  33.                 ]
  34.             ]
  35.         ];
  36.         return $this->es->search($params);
  37.     }
  38. }

  39. // 使用示例
  40. $search = new ProductSearch();
  41. // 搜索名称/属性含"手机"且类型为"电子产品"的商品
  42. $results = $search->search('手机', ['category' => '电子产品']);
  43. print_r($results);
复制代码




以下是更多实用的商品搜索实现示例,结合MySQL与Elasticsearch同步场景:

一、多维度组合搜索示例

// 搜索关键词为"防水",筛选电子类目、价格100-500元、未售出的商品
$params = [
    'index' => 'products',
    'body'  => [
        'query' => [
            'bool' => [
                'must' => [
                    ['multi_match' => ['query' => "防水", 'fields' => ['name','attributes']],
                    ['term' => ['category' => "电子产品"]],
                    ['term' => ['is_sold' => false]]
                ],
                'filter' => [
                    ['range' => ['price' => ['gte' => 100, 'lte' => 500]]]
                ]
            ]
        ]
    ]
];


逻辑说明‌:

must子句处理关键词匹配和精确筛选(类目/售出状态)
filter子句处理数值范围查询(不参与相关性评分)‌
二、权重优化搜索(爆款商品优先)

// 提升销量高、上架时间新的商品权重
$params = [
    'query' => [
        'function_score' => [
            'query' => ['match' => ['name' => "蓝牙耳机"]],
            'functions' => [
                ['field_value_factor' => ['field' => 'sales', 'factor' => 0.1]], // 销量权重
                ['gauss' => ['created_at' => ['origin' => 'now', 'scale' => '30d']]] // 新商品加分
            ]
        ]
    ]
];


适用场景‌:促销活动页,需同时考虑相关性和商品热度‌

三、属性聚合分析(生成商品筛选面板)

// 获取类目分布和价格区间
$params = [
    'size' => 0,
    'aggs' => [
        'category_stats' => ['terms' => ['field' => 'category']],
        'price_ranges' => ['range' => ['field' => 'price', 'ranges' => [
            ['to' => 100], ['from' => 100, 'to' => 500], ['from' => 500]
        ]]]
    ]
];


返回值示例‌:

"aggregations": {
  "category_stats": {
    "buckets": [{"key":"电子产品","doc_count":42}]
  },
  "price_ranges": {
    "buckets": [{"to":100,"doc_count":31}]
  }
}


作用‌:生成前端筛选器的动态数据源‌

四、拼写容错搜索

$params = [
    'query' => [
        'match' => [
            'name' => [
                'query' => "华wei手机",
                'fuzziness' => 'AUTO' // 自动纠错
            ]
        ]
    ]
];


效果‌:可匹配"华为手机"等近似词组,提升搜索体验‌

(此处插入商品搜索优化案例卡片)
</noteList>

五、实时库存同步方案

// MySQL触发器(商品售出时立即同步)
DELIMITER $$
CREATE TRIGGER after_sale_update
AFTER UPDATE ON products
FOR EACH ROW
BEGIN
    IF NEW.is_sold != OLD.is_sold THEN
        CALL sync_to_es(NEW.id); // 调用存储过程同步
    END IF;
END$$
DELIMITER ;


优势‌:确保库存状态的实时性,避免超卖‌

提示:实际部署时需注意

中文分词优化:安装IK分词器并配置自定义词典‌
压力测试:针对bulk操作调整刷新间隔(refresh_interval)‌
监控:通过Kibana跟踪搜索QPS和延迟指标


以下是MySQL存储过程sync_to_es的完整实现代码,用于将指定商品ID的数据实时同步到Elasticsearch:sync_to_es.sql
游客,本帖隐藏的内容需要积分高于 10 才可浏览,您当前积分为 0

该存储过程通过sys_exec调用外部PHP脚本实现同步,需确保MySQL服务器有执行系统命令权限。

配套的PHP同步脚本示例:

sync_script.php

游客,本帖隐藏的内容需要积分高于 10 才可浏览,您当前积分为 0


该方案通过MySQL触发器+存储过程+PHP脚本实现准实时同步,需在MySQL中安装sys_exec UDF函数




相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-7-9 18:15

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表