Skip to content
📖0 阅读·🤍0 点赞

ES中similarity参数故事版

similarity

similarity 指定文档的评分模型

similarity备注
BM25es 和 lucene 默认的评分模型
classicTF/IDF 评分
booleanboolean 模型评分

similarity:数字村的「美食评分大赛」🍽️🏆

想象数字村每年举办一次美食评分大赛,三位风格迥异的评委用不同的标准给菜品打分。这就是Elasticsearch的三种相似度评分模型!


故事:三位美食评委的评分哲学

1. BM25评委:现代综合评分师(默认选择)

json
"recipe_title": {
  "type": "text",
  "similarity": "BM25"  // 默认评委
}

评分特点:

  • 🧠 智能平衡:考虑词频,但避免过度重复
  • 📏 长度归一:长菜谱不会单纯因词多而高分
  • 🔄 饱和机制:一个词出现5次后,额外出现价值递减

实战案例:

json
// 菜谱A: "红烧肉 红烧肉 红烧肉"(重复3次)
// 菜谱B: "红烧肉 搭配 土豆 胡萝卜"(出现1次)

// BM25评分:
// 菜谱A:8分(重复有加成但饱和)
// 菜谱B:7分(内容丰富均衡)

2. Classic评委:传统严格老师(TF/IDF)

json
"recipe_old": {
  "type": "text", 
  "similarity": "classic"  // 传统评分
}

评分特点:

  • 📊 词频至上:出现次数越多分数越高
  • 🚫 无视长度:长菜谱容易得高分
  • 📈 线性增长:出现10次就得10倍分数

实战案例:

json
// 同样搜索"红烧肉"
// 菜谱A: "红烧肉"重复10次 → 10分
// 菜谱B: "红烧肉"出现1次 → 1分
// 结果:菜谱A排名第一(可能内容空洞)

3. Boolean评委:极简主义裁判

json
"recipe_tags": {
  "type": "text",
  "similarity": "boolean"  // 极简评分
}

评分特点:

  • 0️⃣ 非黑即白:要么0分(不存在),要么1分(存在)
  • ⚖️ 绝对平等:所有匹配词项价值相同
  • 🚀 速度最快:计算简单粗暴

实战案例:

json
// 搜索"辣 川菜"
// 菜谱A:包含"辣"和"川菜" → 得分:1(存在)
// 菜谱B:只包含"辣" → 得分:1(存在)  
// 结果:A和B并列第一(无法区分质量)

评分模型对比表

评分模型比喻优点缺点适用场景
BM25米其林评委智能防作弊计算稍复杂通用搜索(默认)
Classic传统美食家结果可预测易被操纵学术文献检索
Boolean快餐质检员速度极快无法排序标签过滤

实战配置示例

场景1:电商商品搜索(推荐BM25)

json
PUT ecommerce
{
  "mappings": {
    "properties": {
      "product_name": {
        "type": "text",
        "similarity": "BM25"  // 防关键词堆砌
      }
    }
  }
}
  • ✅ 防止"手机手机手机"这种垃圾SEO排名靠前

场景2:法律条文检索(适合Classic)

json
PUT law_library
{
  "mappings": {
    "properties": {
      "article_content": {
        "type": "text", 
        "similarity": "classic"  // 词频反映重要性
      }
    }
  }
}
  • ✅ "宪法"出现次数越多,条文越重要

场景3:商品标签过滤(Boolean最佳)

json
PUT products
{
  "mappings": {
    "properties": {
      "product_tags": {
        "type": "text",
        "similarity": "boolean"  // 只需判断存在性
      }
    }
  }
}
  • ✅ 搜索"促销+新品"标签,不关心出现次数

自定义评分模型进阶

调整BM25参数

json
// 像定制评委的评分表
PUT custom_index
{
  "settings": {
    "similarity": {
      "my_bm25": {
        "type": "BM25",
        "k1": 1.2,     // 词频饱和度
        "b": 0.75      // 长度归一化强度
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "similarity": "my_bm25"  // 使用定制评分
      }
    }
  }
}

参数含义:

  • k1值调高:词频影响更大(更像Classic)
  • b值调高:长度惩罚更严厉(短文档优势更大)

记忆口诀

美食评分三评委:

  1. BM25:智能评委
    防作弊 重质量 现代首选
  2. Classic:传统评委
    数次数 可预测 经典可靠
  3. Boolean:极简评委
    只看有无 不论多少 过滤专用

选择指南:

🟢 日常搜索 → BM25(默认)
🟡 词频重要 → Classic
🔴 只需过滤 → Boolean

记住这个美食大赛的比喻,轻松选出最适合的评分模型!🎯👨🍳