其他分享
首页 > 其他分享> > es-控制相关度-打分

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. 在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 终极武器

综述:

  1. 它允许为每个与主查询匹配的文档应用一个或多个函数,以达到改变甚至完全替换原始查询评分 _score 的目的。
  2. function_score查询允许用户指定任何数量的任意函数functions,让它们作用于匹配了初始查询的文档,修改其得分。
 "field_value_factor": {
        "field":    "votes",
        "modifier": "log1p",
        "factor":   0.1
      },
      "boost_mode": "sum",
      "max_boost":  1.5 
{
  "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[\u0027attendees\u0027].value != null) { Math.log(doc[\u0027attendees\u0027].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"
    }
  }
}

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)综合示例

标签:function,term,查询,score,相关度,boost,打分,es
来源: https://www.cnblogs.com/yudidi/p/12754423.html