【实战ES】实战 Elasticsearch:快速上手与深度实践-5.2.1 多字段权重控制(标题、品牌、类目)

news2025/3/27 9:14:42

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路


文章大纲

  • 电商商品搜索实战:多字段权重控制策略
    • 1. 业务场景与核心挑战
      • 1.1 典型搜索问题
      • 1.2 权重失衡的影响数据
    • 2. 权重控制核心方案
      • 2.1 字段权重分配矩阵
      • 2.2 多策略组合方案
    • 3. 高级权重控制技巧
      • 3.1 动态权重调整
      • 3.2 语义权重增强
    • 4. 效果验证与数据分析
      • 4.1 A/B测试结果对比
      • 4.2 `关键词匹配质量分析`
    • 5. 性能优化方案
      • 5.1 索引结构优化
      • 5.2 缓存策略优化
    • 6. 异常场景处理
      • 6.1 权重失效诊断
      • 6.2 权重漂移监控
    • 7. 最佳实践总结
      • 7.1 `黄金法则`
      • 7.2 避坑指南

电商商品搜索实战:多字段权重控制策略

1. 业务场景与核心挑战

在这里插入图片描述

1.1 典型搜索问题

  • 案例1:搜索"苹果手机"出现水果类商品
  • 案例2:"小米电视"优先展示配件而非主机
  • 案例3:品牌词"NIKE"被分词导致召回偏差

1.2 权重失衡的影响数据

问题类型点击率下降转化率下降用户跳出率上升
标题权重不足38%25%+45%
品牌识别错误52%41%+68%
类目匹配偏差27%19%+32%

2. 权重控制核心方案

2.1 字段权重分配矩阵

字段名称基础权重动态权重范围特殊场景策略
title108-15促销商品x1.5
brand85-12品牌专区x2.0
category64-8类目导航页x1.8
tags43-5新品标签x1.3
description21-3长尾词搜索x1.2

2.2 多策略组合方案

{
  "query": {
    "bool": {
      // should 子句表示其中的查询条件只要满足一个或多个即可,
      // Elasticsearch会为每个满足条件的文档计算分数,最后综合这些分数来对文档进行排序
      "should": [
        {
          "match": {
            "title": {
              // 查询的关键词,{{query}} 是一个占位符,实际使用时需要替换为具体的查询词
              "query": "{{query}}",
              
              // 该查询条件的权重,这里设置为 10,权重越高,满足此条件的文档在排序时越靠前
              "boost": 10,
              // 指定使用的分词器为 title_smartcn,分词器会将查询词和文档中的文本进行分词处理,以便进行匹配
              "analyzer": "title_smartcn"
            }
          }
        },
        {
          "term": {
            "brand": {
              // 查询的品牌值,{{brand}} 是占位符,需替换为具体的品牌名称
              "value": "{{brand}}",
              
              // 该查询条件的权重,设置为 8,满足此条件的文档会在排序中获得相应的加分
              "boost": 8
            }
          }
        },
        {
          "match": {
            "category_path": {
              // 查询的类目路径,{{category}} 是占位符,要替换为具体的类目路径
              "query": "{{category}}",
              // 该查询条件的权重,设置为 6
              "boost": 6,
              // operator 设置为 and,表示查询词必须全部出现在文档的 category_path 字段中才会匹配成功
              "operator": "and"
            }
          }
        }
      ]
    }
  }
}

3. 高级权重控制技巧

3.1 动态权重调整

POST /products/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query": "华为手机",
          "fields": ["title^10", "brand^8", "category^6"]
        }
      },
      "functions": [
        {
          "filter": { "term": { "is_promotion": true }},
          "weight": 1.5
        },
        {
          "filter": { "term": { "in_stock": true }},
          "weight": 1.2
        }
      ],
      "boost_mode": "multiply"
    }
  }
}

3.2 语义权重增强

{
    "query": {
        "multi_match": {
            // 要搜索的关键词,这里是 "夏季连衣裙",表示用户希望查找包含该关键词的文档
            "query": "夏季连衣裙",
            // 查询类型为 cross_fields
            // cross_fields 类型会将查询词在所有指定的字段中进行匹配,就好像这些字段是一个大的字段一样
            // 它会在各个字段中查找匹配项,并综合考虑各个字段的匹配情况来计算文档的相关性得分
            "type": "cross_fields",
            // 指定要在哪些字段上进行搜索,每个字段后面可以跟一个权重(用 ^ 符号指定)
            // 权重表示该字段在计算相关性得分时的重要程度,权重越高,该字段的匹配结果对最终得分的影响越大
            "fields": [
                // 标题字段,权重为 10,意味着该字段的匹配结果对最终得分的影响较大
                "title^10",
                // 分类字段,权重为 6
                "category^6",
                // 风格标签字段,权重为 5
                "style_tags^5",
                // 材质字段,权重为 3,影响相对较小
                "material^3"
            ],
            
            // tie_breaker 参数用于处理多个字段匹配时的得分情况
            // 当一个文档在多个字段上都有匹配时,Elasticsearch 会计算每个字段的得分
            // tie_breaker 是一个介于 0 到 1 之间的数值,它会将非最高得分的字段的得分乘以该值后再与最高得分相加
            // 这里设置为 0.3,意味着非最高得分的字段的得分会乘以 0.3 后再参与最终得分的计算
            "tie_breaker": 0.3
        }
    }
}

4. 效果验证与数据分析

4.1 A/B测试结果对比

策略版本CTR转化率平均排名提升搜索耗时
基础权重12.3%3.8%-220ms
动态权重18.7%5.2%+3.2位245ms
语义增强版21.5%6.1%+4.8位260ms

4.2 关键词匹配质量分析

搜索词旧策略TOP1相关度新策略TOP1相关度提升幅度
苹果手机72%95%+23%
小米电视68%91%+23%
耐克运动鞋65%89%+24%
夏季真丝裙58%82%+24%

5. 性能优化方案

5.1 索引结构优化

// 该请求用于创建一个名为 "products" 的索引
PUT /products
{
    "mappings": {
        "properties": {
            "title": {
                // 指定字段类型为 text,适用于需要进行全文搜索的文本字段
                "type": "text",
                // 指定使用名为 "title_analyzer" 的分词器对该字段进行分词处理
                // 分词器会将文本拆分成一个个词项,便于后续的搜索和匹配操作
                "analyzer": "title_analyzer",
                "fields": {
                    // 在 "title" 字段下创建一个子字段 "keyword",类型为 "keyword"
                    // "keyword" 类型适用于需要精确匹配的场景,如排序、聚合等
                    "keyword": { "type": "keyword" }
                }
            },
            "brand": {
                // 指定字段类型为 text,可进行全文搜索
                "type": "text",
                "fields": {
                    // 在 "brand" 字段下创建一个子字段 "exact",类型为 "keyword"
                    // 用于对品牌进行精确匹配,例如在筛选特定品牌的商品时会用到
                    "exact": { "type": "keyword" }
                }
            }
        }
    },
    "settings": {
        "index": {
            "similarity": {
                // 定义一个名为 "custom_bm25" 的自定义相似度算法
                "custom_bm25": {
                    // 指定相似度算法的类型为 BM25,BM25 是一种常用的文本相似度算法
                    "type": "BM25",
                    // "b" 是 BM25 算法中的一个参数,用于控制文档长度对相似度得分的影响
                    // 取值范围通常在 0 到 1 之间,这里设置为 0.75
                    "b": 0.75,
                    
                    // "k1" 也是 BM25 算法中的一个参数,用于控制词频对相似度得分的影响
                    // 通常取值在 1.2 到 2.0 之间,这里设置为 1.2
                    "k1": 1.2
                }
            }
        }
    }
}

5.2 缓存策略优化

缓存类型命中率内存占用QPS提升适用场景
Request Cache35%512MB+40%高频相同查询
Query Cache28%1GB+25%过滤条件重复
Fielddata42%2GB+18%排序/聚合操作

6. 异常场景处理

6.1 权重失效诊断

// 向 Elasticsearch 发送一个 GET 请求,用于验证在 "products" 索引上执行的查询语句是否有效
// 同时添加了 "explain" 参数,该参数会让 Elasticsearch 返回详细的解释信息,帮助我们理解查询是如何执行以及如何计算得分的
GET /products/_validate/query?explain
{
    "query": {
        "match": {
            "title": {
                // 要在 "title" 字段中搜索的关键词,这里是 "手机"
                "query": "手机",
                
                // 为该查询条件设置权重,权重为 10
                // 权重会影响文档的相关性得分,权重越高,满足此条件的文档在排序时越有可能排在前面
                "boost": 10
            }
        }
    }
}

6.2 权重漂移监控

监控指标阈值检查频率自动修复方案
标题权重偏离>±15%每小时滚动重启查询节点
品牌召回率<85%实时触发权重重新加载
类目准确度<90%每天自动调整boost值

7. 最佳实践总结

7.1 黄金法则

    1. 标题优先:保持标题字段最高基础权重(建议8-15倍
    1. 品牌精确:对品牌字段使用keyword类型+term查询
    1. 类目引导:构建层级式类目权重(如一级类目6,二级类目4)
    1. 动态调节:结合运营活动实时调整权重系数

7.2 避坑指南

  • ❌ 避免无限制提升单一字段权重
  • 禁止在未测试情况下修改生产环境权重
  • ❌ 慎用超过20倍的boost值
  • 不要忽略停用词对权重的影响

实施建议:定期使用Explain API分析排序逻辑,结合用户点击日志持续优化权重配置,建议每月执行全量权重策略评估,采用蓝绿部署方式更新权重参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何避免测试数据准备不充分或不可复用

避免测试数据准备不充分或不可复用的关键方法包括明确数据需求、统一数据管理工具、建立数据复用机制、定期维护更新测试数据以及加强团队沟通与协作。 其中&#xff0c;统一数据管理工具对确保数据质量和复用性尤为重要。例如&#xff0c;许多团队采用专门的测试数据管理工具以…

使用AI一步一步实现若依(23)

功能23&#xff1a;从后端获取路由/菜单数据 功能22&#xff1a;用户管理 功能21&#xff1a;使用axios发送请求 功能20&#xff1a;使用分页插件 功能19&#xff1a;集成MyBatis-Plus 功能18&#xff1a;创建后端工程 功能17&#xff1a;菜单管理 功能16&#xff1a;角色管理…

第一天学爬虫

阅读提示&#xff1a;我今天才开始尝试爬虫&#xff0c;写的不好请见谅。 一、准备工具 requests库&#xff1a;发送HTTP请求并获取网页内容。BeautifulSoup库&#xff1a;解析HTML页面并提取数据。pandas库&#xff1a;保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…

W、M、C练题笔记(持续更新中)

web here are the flag 点击&#xff0c;页面跳转404.php&#xff0c;用bp抓包访问/flag.php页面&#xff0c;得到flag用base64解码 TryToFindFlag 打开后查看源代码 发现是robots协议&#xff0c;访问robots.txt 访问flllaaa......&#xff0c;得到空白页面&#xff0c;查看…

CVE-2021-45232未授权接口练习笔记

CVE-2021-45232 是 Apache APISIX Dashboard 中的一个严重权限漏洞&#xff0c;类似于攻击者无需密码即可拿到整个网关系统的“万能钥匙”。攻击者利用此漏洞&#xff0c;可直接操控网关流量转发规则&#xff0c;甚至远程执行代码&#xff0c;引发服务器沦陷。 默认账户密码导致…

贪心算法——c#

贪心算法通俗解释 贪心算法是一种"每一步都选择当前最优解"的算法策略。它不关心全局是否最优&#xff0c;而是通过局部最优的累积来逼近最终解。优点是简单高效&#xff0c;缺点是可能无法得到全局最优解。 一句话秒懂 自动售货机找零钱&#xff1a;用最少数量的…

Retrofit中scalars转换html为字符串

简介 在Retrofit中&#xff0c;如果你想直接获取HTML或其他文本格式的响应内容而不是将其映射到一个模型类&#xff0c;ScalarsConverterFactory 就派上用场了。ScalarsConverterFactory 是一个转换器工厂&#xff0c;它能够将响应体转换为Java基本类型如String、Integer或Byte…

【微服务架构】SpringCloud(七):配置中心 Spring Cloud Config

文章目录 配置中心为什么需要配置中心配置中心介绍 服务搭建基于GITHUB1.创建仓库2.新建微服务作为配置中心服务3.启动测试拉取 匹配规则分支读取 客户端配置配置文件引入依赖使用远程配置 刷新配置手动配置热更新自动刷新erlang安装RabbitMQ安装环境变量管理界面服务配置测试 …

Linux学习笔记(应用篇二)

基于I.MX6ULL.MINI开发板 开发板与电脑相互通信电脑与开发板互传文件 开发板与电脑相互通信 用网线将电脑与开发板连接 本人使用的是Ubuntu系统&#xff0c;不是虚拟机 一般来说刚开始电脑和开发板是ping不通的 首先查看电脑的 IP WinR&#xff0c;cmd调出终端 我使用的是…

记录一次部署k3s后,服务404 page not found,nginx显示正常

服务部署k3s后&#xff0c;正常入口端怎么返回都是80&#xff0c;且返回错误 TRAEFIK DEFAULT CERT ERR_CERT_AUTHORITY_INVALID ngnix显示也是正常&#xff0c;怎么找也找不到问题 后来通过 iptables -L -n -t nat|grep 80 发现入口端流量被DNAT转到新的服务 而k3s中&#…

mac上安装nvm及nvm的基本语法使用!!

种一棵树&#xff0c;最好是十年前&#xff0c;其次是现在&#xff01;想要改变&#xff0c;从此刻开始&#xff0c;一切都不晚&#xff01; 目录 nvm是什么&#xff1f;前提条件&#xff1a;安装homebrew如果系统已经有node版本&#xff1a;在mac上安装nvm&#xff1a;用nvm安…

(基本常识)C++中const与引用——面试常问

作者&#xff1a;求一个demo 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 内容通俗易懂&#xff0c;没有废话&#xff0c;文章最后是面试常问内容&#xff08;建议通过标题目录学习&#xff09; 废话不多…

dfs(深度优先)——太抽象了

1. 两种方法 #include<bits/stdc.h> using namespace std; //void dfs(int index,int n,vector<int> current) //{ // if(index>n){ // for(int i0;i<current.size();i){ // cout<<current[i]<<" "; // } // cout<<endl;…

python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测

dlib 安装方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 环境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人脸检测 import cv2 import face_recognition# 读取人脸图片 img cv2.imread(r"C:\Users\123\…

redis解决缓存穿透/击穿/雪崩

文章目录 1.缓存穿透1.1 概念1.2 解决方案1.2.1 缓存空对象1.2.2 布隆过滤 1.2 店铺查询使用缓存穿透解决方案1.2.1 流程 2.缓存雪崩2.1 什么是缓存雪崩&#xff1f;2.2 雪崩解决方案 3.缓存击穿3.1 什么是缓存击穿&#xff1f;3.2解决方案3.2.1 基于互斥锁解决缓存击穿问题&am…

《TCP/IP网络编程》学习笔记 | Chapter 22:重叠 I/O 模型

《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型 《TCP/IP网络编程》学习笔记 | Chapter 22&#xff1a;重叠 I/O 模型理解重叠 I/O 模型重叠 I/O本章讨论的重叠 I/O 的重点不在于 I/O 创建重叠 I/O 套接字执行重叠 I/O 的 WSASend 函数进行重叠 I/O 的 WSA…

python每日十题(10)

在Python语言中&#xff0c;源文件的扩展名&#xff08;后缀名&#xff09;一般使用.py。 保留字&#xff0c;也称关键字&#xff0c;是指被编程语言内部定义并保留使用的标识符。Python 3.x有35个关键字&#xff0c;分别为&#xff1a;and&#xff0c;as&#xff0c;assert&am…

LabVIEW液压振动锤控制系统

在现代工程机械领域&#xff0c;液压振动锤的高效与精准控制日益显得重要。本文通过LabVIEW软件&#xff0c;展开液压振动锤启停共振控制技术的研究与应用&#xff0c;探讨如何通过改进控制系统来优化液压振动锤的工作性能&#xff0c;确保其在复杂工况下的稳定性与效率。 ​ …

简单介绍My—Batis

1.什么是My—Batis&#xff1f; My—Batis是一个持久层框架&#xff0c;提供了sql映射功能&#xff0c;能方便的将数据库表和java对象进行映射&#xff0c;通过My—Batis可以将项目中的数据存储在数据库中&#xff0c;以便我们进行调用。值得注意的是My—Batis和spring不是一回…

ALTER TABLE SHRINK SPACE及MOVE的区别与适用场景

以下是 ‌Oracle 数据库‌中三个收缩表空间命令的对比&#xff1a; 1. ALTER TABLE table_name SHRINK SPACE;‌ ‌作用‌&#xff1a;直接重组表数据并移动高水位线&#xff08;HWM&#xff09;&#xff0c;释放未使用的空间到表空间‌。 影响‌&#xff1a; 会锁表&#…