zoukankan      html  css  js  c++  java
  • es-控制相关度-打分

    相关度评分背后的理论

    // 附录8

    总述: 匹配文档+实用评分函数打分

    Lucene(或 Elasticsearch)使用 布尔模型(Boolean model) 查找匹配文档,
    并用一个名为 实用评分函数(practical scoring function) 的公式来计算相关度。
    这个公式借鉴了 词频/逆向文档频率(term frequency/inverse document frequency) 和 向量空间模型(vector space model),
    同时也加入了一些现代的新特性,如协调因子(coordination factor),字段长度归一化(field length normalization),以及词或查询语句权重提升。

    字段长度归一化

    什么是相关性?&explain // TODO

    https://www.cnblogs.com/yudidi/p/12841277.html

    基本过程

    查询结果
    对查询结果打分

    单个词查询的打分过程:

    一个多词查询的打分过程 TODO

    修改打分的方法

    1. boost
      综述: 可以实用boost的几个语句: match、multi_match、simple_query_string或query_string查询,基于每个词条或者某个字段来控制boost。// 附录11

    Q: boost的2种形式: boost:value | field^value

    // 1. boost单个词条或字段?
     "match": {
                "description": {
                  "query": "elasticsearch big data",
                  "boost": 2.5
                }
              }
    // 2. 对于跨越多个字段的查询,如multi_match,用户可以指定整个multi_match的boost。
    "multi_match": {
          "query": "elasticsearch big data",
          "fields": [
            "name",
            "description"
          ],
          "boost": 2.5
        }
    // 3. multi_match也可以只对特定字段指定一个boost。
    "multi_match": {
          "query": "elasticsearch big data",
          "fields": [
            "name^3",                               # 使用^3后缀,name字段被boost了3倍
            "description"
          ]
        }
    

    1.1 在query-bool-should-某个字段的match语句中设置2个字段boost分为2和1,表示前1个字段比后一个字段重要2倍。 // 附录4

    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                     给字段title设置boost值=2
              }
            },
            {
              "match": { 
                "content": "quick brown fox"
                // content字段,默认boost=1.
              }
            }
          ]
        }
      }
    }
    

    title 查询语句的重要性是 content 查询的 2 倍,因为它的权重提升值为 2 。
    没有设置 boost 的查询语句的值为 1 。

    1. 调整查询结构中查询语句的所处层次,从而或多或少改变其重要性。 // 附录5
    // quick OR brown OR red OR fox
    "should": [
            { "term": { "text": "quick" }},
            { "term": { "text": "brown" }},
            { "term": { "text": "red"   }},
            { "term": { "text": "fox"   }}
          ]
    =>
    // quick OR (brown OR red) OR fox
     "should": [
            { "term": { "text": "quick" }},
            { "term": { "text": "fox"   }},
            {
              "bool": {
                "should": [
                  { "term": { "text": "brown" }},
                  { "term": { "text": "red"   }}
                ]
              }
            }
          ]
    
    1. 通过boosting的negative对包含负向词的文档降权。// 附录6
      为了达到效果, negative_boost 的值必须小于 1.0 。在这个示例中,所有包含负向词的文档评分 _score 都会减半。

    2. constant_score忽略TF/IDF

    5. function_score 终极武器 // 附录12

    综述:

    1. 它允许为每个与主查询匹配的文档应用一个或多个函数,以达到改变甚至完全替换原始查询评分 _score 的目的。
    2. function_score查询允许用户指定任何数量的任意函数functions,让它们作用于匹配了初始查询的文档,修改其得分。
    • 5.1 weight关键字
      Q: function_score的weight和boost关键字的作用方式不同。
      A: weight函数将得分乘以一个常数。注意,普通的boost字段按照标准化来增加分数,而weight是真正将得分乘以确定的数值。

    • 5.2 functions关键字
      指定一个函数,函数内使用weight //附录7
      指定多个函数,每个函数内使用weight // 附录9

    Q: functions每个函数都可以有filter
    A: functions列表中的每个函数都可以指定一个 filter 过滤器,在这种情况下,函数只会被应用到那些与过滤器匹配的文档 // 附录13

    Q: function_score中的过滤 vs. 查询
    A: function_score 查询接受 query 或 filter 作为主查询或主过滤,如果没有特别指定,则默认使用 match_all 查询。// 附录14
    如果是filter,则返回的基础分_score都是1.

    • 5.3 得分合并
      得分合并有以下两种情况:
      从每个单独的函数而来的得分是如何合并的,这被称为score_mode。
      从函数而来的得分是如何同原始查询得分合并的,这被称为boost_mode。

    Q: score_mode的主要作用呢
    A: 把多个结果缩减为1个结果,然后和_score进行合并。
    A: 每个函数返回一个结果,所以需要一种将多个结果缩减到单个值的方式,然后才能将其与原始评分 _score 合并。// 附录15
    所以, 假设有3个函数,f1,f2,f3, score_mode=sum, boost_mode=multiply
    那么对文档d1, d1的最终得分 == sum(f1,f2,f3)multiply_score。

    Q: score_mode的作用对象
    A: 对多个函数的打分结果f1,f2,f3,执行sum/max/min/multiply/first

    • 5.4 field_value_factor函数
      全部的关键字如下: TODO每个关键字的含义
     "field_value_factor": {
            "field":    "votes",
            "modifier": "log1p",
            "factor":   0.1
          },
          "boost_mode": "sum",
          "max_boost":  1.5 
    

    Q: field_value_factor配置转换成计算公式(modifier(field*factor)) // 附录16
    A:

     "field_value_factor": {
                    "field": "likes",
                    "factor": 1.2,
                    "modifier": "sqrt",
                    "missing": 1
                }
    // 会被翻译为如下公式
    sqrt(1.2 * doc['likes'].value)
    
    • 5.5 function_score+functions的书写格式 //附录10
    {
      "query": {
        "function_score": {
          "query": {
            "match_all": {}
          },
          "functions": [
            {
              "weight": 1.5,
              "filter": {
                "term": {
                  "description": "hadoop"
                }
              }
            },
            {
              "field_value_factor": {
                "field": "reviews",
                "factor": 10.5,
                "modifier": "log1p",
                "missing": 0
              }
            },
            {
              "script_score": {
                "script": {
                  "source": "if (doc[u0027attendeesu0027].value != null) { Math.log(doc[u0027attendeesu0027].values.size() * params.myweight)} else _score",
                  "params": {
                    "myweight": 3
                  }
                }
              }
            },
            {
              "gauss": {
                "location_event.geolocation": {
                  "origin": "40.018528,-105.275806",
                  "offset": "100m",
                  "scale": "2km",
                  "decay": "0.5"
                }
              }
            }
          ],
          "score_mode":"sum",
          "boost_mode":"replace"
        }
      }
    }
    
    • 5.6 脚本打分 //TODO

    ES打分机制和es的function_score(TODO)

    https://www.elastic.co/guide/en/elasticsearch/reference/6.3/query-dsl-function-score-query.html#

    ES打分机制

    1. TF-IDF算法计算文档得分 // 附录1: 基本上就是网页排名(pagerank)*相关性(TF-IDF)。

    boost_mode

    "boost_mode": "multiply", // query score and function score is multiplied (default)

    参考

    1. 数学之美-第11章 如何确定网页和查询的相关性。
    2. 查询打分和自定义打分相乘得最终得分
    3. 触类旁通Elasticsearch:打分
    4. boost关键提升字段权重
    5. 调整should语句的组合关系, quick OR (brown OR red) OR fox
    6. 所有包含负向词的文档评分 _score 都会减半
    7. weight*_score,但是boost按照标准化来增加分数TODO--五、function_score
    8. bool匹配,
    9. 五、function_score--functions--多个函数
    10. (7)综合示例
    11. 二、boosting

    https://time.geekbang.org/course/detail/100030501-108287

    1. 五、function_score
    2. 过滤集提升权重--functions中的函数只会被应用到那些与过滤器匹配的文档
    3. 过滤集提升权重--过滤_vs_查询
    4. 过滤集提升权重--评分模式 score_mode
    5. field_value_factor转换成公式的例子
  • 相关阅读:
    Android学习总结——实现Home键功能
    Android学习总结——SQLite
    Android学习总结——文件储存
    Android学习总结——SharedPreferences
    Android学习总结——Content Provider
    Android学习总结——Service组件
    IDEA 创建和使用tomcat
    IDEA 图标介绍。 缓存和索引介绍、清理方法和Debug使用
    IDEA 常用快捷键
    IntelliJ IDEA常用设置(一)
  • 原文地址:https://www.cnblogs.com/yudidi/p/12754423.html
Copyright © 2011-2022 走看看