Elasticsearch评分相关度算法解析

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: Elasticsearch评分相关度算法解析

Elasticsearch评分相关度算法解析

TF算法

TF算法,全称 Term frequency ,索引词频率算法。意义就像它的名字,会根据索引词的频率来计算,索引词出现的次数越多,分数越高。

例子如下

  • 搜索 hello

有两份文档:A文档:hello world!,B文档:hello hello hello

结果是B文档的 score 大于A文档。

  • 搜索 hello world

有两份文档:A文档:hello world!,B文档:hello,are you ok?

结果是A文档的score大于B文档。

要根据索引词来综合考虑。

如果不在意词在某个字段中出现的频次,而只在意是否出现过,则可以在字段映射中禁用词频统计

{
  "mappings": {
    "_doc": {
      "properties": {
        "text": {
          "type":          "string",
          "index_options": "docs"
        }
      }
    }
  }
}

将参数 index_options 设置为 docs 可以禁用词频统计及词频位置,这个映射的字段不会计算词的出现次数,对于短语或近似查询也不可用。要求精确查询的 not_analyzed 字符串字段会默认使用该设置。

IDF算法

IDF 算法全称 Inverse Document Frequency ,逆文本频率。搜索文本的词在整个索引的所有文档中出现的次数越多,这个词所占的 score 的比重就越低。

例子如下

搜索hello world,其中索引中hello出现次数1000次,world出现100次。

有三份文档:A 文档 hello,are you ok? , B 文档 The world is interesting! , C 文档 hello world!

结果是:C>B>A

由于hello出现频率高,所以单个hello得到的score比不上world

Field-length norm算法 (字段长度归一值)

  • 字段的长度是多少?

字段越短,字段的权重越高 。如果词出现在类似标题 title 这样的字段,要比它出现在内容 body 这样的字段中的相关度更高。

例子如下:

搜索 hello world!

有两份文档:A文档 hello world! ,B文档 hello world,I'm xxx!

结果是:A>B

词频(term frequency)、逆向文档频率(inverse document frequency)和字段长度归一值(field-length norm)——是在索引时计算并存储的。 最后将它们结合在一起计算单个词在特定文档中的 权重 。

当然,查询通常不止一个词,所以需要一种合并多词权重的方式——向量空间模型(vector space model)。

三种算法的综合

(下面属于理论分析,并不真实这样计算)

TF 算法针对在 Field 中,索引词出现的频率;

IDF 算法针对在整个索引中的索引词出现的频率;

Field-length norm 算法针对 Field 的长度。

那么可以这样分析,由于 Field-length norm 算法并不直接针对 score ,所以它是最后起作用的,它理论上类似于一个除数。而 TFIDF 是平等的, IDF 计算出每一个索引词的 score 量, TF 来计算整个文档中索引词的 score 的加和。

  • 也就是如下的计算:
  1. IDF:计算索引词的单位 score ,比如 hello=0.1,world=0.2
  2. TF:计算整个文档的 sum(score)hello world!I'm xxx. 得到 0.1+0.2=0.3
  3. Field-length norm:将 sum(score)/对应Field的长度 ,得出的结果就是 score

利用score计算API分析

创建模拟数据

  • PUT /test-7
{
  "settings": {
    "index":{
      "number_of_shards":3,
            "number_of_replicas":1
    }
  },
  "mappings": {
      "properties": {
        "name":{
          "type": "text"
        }
      }
  }
}
  • PUT /test-7/_doc/1
{
    "name": "li feng"
}
  • PUT /test-7/_doc/2
{
    "name": "li er"
}

explain分析

  • /test-7/_doc/_search?explain=true
{
    "query": {
        "match": {
            "name": "li"
        }
    }
}
  • 响应
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_shard": "[test-7][1]",
                "_node": "DpJZ5rhrStKpiur5hZ_ilw",
                "_index": "test-7",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.2876821,
                "_source": {
                    "name": "li er"
                },
                // 先列出分数
                "_explanation": {
                    "value": 0.2876821,
                    // 分数的组成, details详细分析
                    "description": "weight(name:li in 0) [PerFieldSimilarity], result of:",
                    // 解释分数
                    "details": [
                        {
                            "value": 0.2876821,
                            "description": "score(freq=1.0), computed as boost * idf * tf from:",
                            "details": [
                                {
                                    "value": 2.2,
                                    "description": "boost",
                                    "details": []
                                },
                                {
                                    "value": 0.2876821,
                                    "description": "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                                    // 逆文本频率 计算 idf
                                    "details": [
                                        {
                                            "value": 1,
                                            // 表示从当前分片中匹配到的文档记录数
                                            "description": "n, number of documents containing term",
                                            "details": []
                                        },
                                        {
                                            "value": 1,
                                            // 表示的是当前查询记录所处的分片上当前索引的文档数; 如果我们有多个分片,那么索引数据会被存储到多个分片上,每个分片上的文档记录数相加,得到的就是当前索引的文档总计录数了
                                            "description": "N, total number of documents with field",
                                            "details": []
                                        }
                                    ]
                                },
                                {
                                    "value": 0.45454544,
                                    "description": "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                                    // 索引词频率计算 tf
                                    "details": [
                                        {
                                            "value": 1.0,
                                            // 检索关键词组在被检索字段的词组中出现的频率,即出现了多少次,比如上面的执行计划搜索 li 在字段中出现1次 即为1
                                            "description": "freq, occurrences of term within document",
                                            "details": []
                                        },
                                        {
                                            "value": 1.2,
                                            // 词的饱和度值,默认值为1.2
                                            "description": "k1, term saturation parameter",
                                            "details": []
                                        },
                                        {
                                            "value": 0.75,
                                            // 长度归一化评分 默认值为0.75
                                            "description": "b, length normalization parameter",
                                            "details": []
                                        },
                                        {
                                            "value": 2.0,
                                            // 被检索字段分词后的词组长度
                                            "description": "dl, length of field",
                                            "details": []
                                        },
                                        {
                                            "value": 2.0,
                                            // 分片中当前被检索字段的平均词组数值
                                            "description": "avgdl, average length of field",
                                            "details": []
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            },
            {
                "_shard": "[test-7][2]",
                "_node": "DpJZ5rhrStKpiur5hZ_ilw",
                "_index": "test-7",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.2876821,
                "_source": {
                    "name": "li feng"
                },
                "_explanation": {
                    "value": 0.2876821,
                    "description": "weight(name:li in 0) [PerFieldSimilarity], result of:",
                    "details": [
                        {
                            "value": 0.2876821,
                            "description": "score(freq=1.0), computed as boost * idf * tf from:",
                            "details": [
                                {
                                    "value": 2.2,
                                    "description": "boost",
                                    "details": []
                                },
                                {
                                    "value": 0.2876821,
                                    "description": "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                                    "details": [
                                        {
                                            "value": 1,
                                            "description": "n, number of documents containing term",
                                            "details": []
                                        },
                                        {
                                            "value": 1,
                                            "description": "N, total number of documents with field",
                                            "details": []
                                        }
                                    ]
                                },
                                {
                                    "value": 0.45454544,
                                    "description": "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                                    "details": [
                                        {
                                            "value": 1.0,
                                            "description": "freq, occurrences of term within document",
                                            "details": []
                                        },
                                        {
                                            "value": 1.2,
                                            "description": "k1, term saturation parameter",
                                            "details": []
                                        },
                                        {
                                            "value": 0.75,
                                            "description": "b, length normalization parameter",
                                            "details": []
                                        },
                                        {
                                            "value": 2.0,
                                            "description": "dl, length of field",
                                            "details": []
                                        },
                                        {
                                            "value": 2.0,
                                            "description": "avgdl, average length of field",
                                            "details": []
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            }
        ]
    }
}

上面还有一个 boost,这个我们解释一下,

对于每一个 term 的权值,其默认值为2.2,我们可以在创建索引 mapping 结构的时候指定字段的 boost 的值,更多情况下,我们可以使用 boost 来作为 ES搜索结果的调优方案,比如搜索文档标题我们可以将boost 权重设置大一些,在搜索文档内容的时候,我们可以将 boost 权重设置小一些,从而实现动态的调整搜索结果,实现搜索不同的字段计算权重不同

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
目录
相关文章
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
2月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
572 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
2月前
|
机器学习/深度学习 存储 算法
动态规划算法深度解析:0-1背包问题
0-1背包问题是经典的组合优化问题,目标是在给定物品重量和价值及背包容量限制下,选取物品使得总价值最大化且每个物品仅能被选一次。该问题通常采用动态规划方法解决,通过构建二维状态表dp[i][j]记录前i个物品在容量j时的最大价值,利用状态转移方程避免重复计算子问题,从而高效求解最优解。
443 1
|
2月前
|
算法 搜索推荐 Java
贪心算法:部分背包问题深度解析
该Java代码基于贪心算法求解分数背包问题,通过按单位价值降序排序,优先装入高价值物品,并支持部分装入。核心包括冒泡排序优化、分阶段装入策略及精度控制,体现贪心选择性质,适用于可分割资源的最优化场景。
262 1
贪心算法:部分背包问题深度解析
|
2月前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
2月前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
机器学习/深度学习 算法 自动驾驶
477 0
|
2月前
|
机器学习/深度学习 人工智能 资源调度
大语言模型的核心算法——简要解析
大语言模型的核心算法基于Transformer架构,以自注意力机制为核心,通过Q、K、V矩阵动态捕捉序列内部关系。多头注意力增强模型表达能力,位置编码(如RoPE)解决顺序信息问题。Flash Attention优化计算效率,GQA平衡性能与资源消耗。训练上,DPO替代RLHF提升效率,MoE架构实现参数扩展,Constitutional AI实现自监督对齐。整体技术推动模型在长序列、低资源下的性能突破。
383 8
|
2月前
|
算法 API 数据安全/隐私保护
深度解析京东图片搜索API:从图像识别到商品匹配的算法实践
京东图片搜索API基于图像识别技术,支持通过上传图片或图片URL搜索相似商品,提供智能匹配、结果筛选、分页查询等功能。适用于比价、竞品分析、推荐系统等场景。支持Python等开发语言,提供详细请求示例与文档。
|
4月前
|
机器学习/深度学习 人工智能 编解码
AI视觉新突破:多角度理解3D世界的算法原理全解析
多视角条件扩散算法通过多张图片输入生成高质量3D模型,克服了单图建模背面细节缺失的问题。该技术模拟人类多角度观察方式,结合跨视图注意力机制与一致性损失优化,大幅提升几何精度与纹理保真度,成为AI 3D生成的重要突破。
392 0

热门文章

最新文章

推荐镜像

更多
  • DNS
  • 下一篇
    oss云网关配置