Lucene’s Practical Scoring Function

https://www.elastic.co/guide/en/elasticsearch/guide/current/practical-scoring-function.html

For multiterm queries, Lucene takes the Boolean model, TF/IDF, and the vector space model and combines them in a single efficient package that collects matching documents and scores them as it goes.

对于多个词构成的查询,Lucene 对匹配的结果集进行了封装,并且结合boolean模型,tf/idf,向量空间模型等条件,计算了它们的分值

如下的query dsl,就是一个multiterm query

GET /my_index/doc/_search
{
  "query": {
    "match": {
      "text": "quick fox"
    }
  }
}

在es内部,会被重写为如下的形式:

GET /my_index/doc/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": { "text": "quick" }},
        {"term": { "text": "fox"   }}
      ]
    }
  }
}

这个bool query,实现了boolean 模型,在这个例子中,只会命中包含了quick和fox的文档。

当文档匹配一个查询,lucene会为结合每个匹配的词,计算这个query的分值。这个计算分值的公式被称为practical 分值函数。它看起来很吓人,但是实际上,部分组件是你已经知道的了,下面会讨论一些新的元素。

score(q,d)  =    # is the relevance score of document d for query q.
            queryNorm(q)  # 归一化因子.
          · coord(q,d)    #协调因子.
          · ∑ (           # query中的每一个term的权重总和.
                tf(t in d)   #  
              · idf(t)²      
              · t.getBoost() 
              · norm(t,d)    
            ) (t in q)    

Query Normalization Factor

The query normalization factor (queryNorm) is an attempt to normalize a query so that the results from one query may be compared with the results of another.
使不同的query之间更好做比较。

它不能很好的工作,不用用它来比较不同query的结果。
This factor is calculated at the beginning of the query. The actual calculation depends on the queries involved, but a typical implementation is as follows:
这个因子,再query开始的时候计算,

queryNorm = 1 / √sumOfSquaredWeights 

sumOfSquaredWeights 的计算方法是,把query中的所有的term的idf值加起来,然后求平方

每个文档的归一化因子,是相同的,而且你不能改变它的值。不管你要做什么,你都可以忽略它

Query Coordination

协调因子是被用来奖励那些包含较高比例term的文档。意味着,文档中出现的terms越多,document匹配query的比例越大。

假设我们有一个query “quick brown fox”,每个term的权重是1.5,如果没有协调因子,分值是每个term的和

  • Document with fox → score: 1.5
  • Document with quick fox → score: 3.0
  • Document with quick brown fox → score: 4.5

协调因子将term权重,乘以文档中匹配的term的数量,并除以匹配的term总数。有了协调因子,分数变成如下的求法:

  • Document with fox → score: 1.5 * 1 / 3 = 0.5
  • Document with quick fox → score: 3.0 * 2 / 3 = 2.0
  • Document with quick brown fox → score: 4.5 * 3 / 3 = 4.5

协调因子的作用是,使包含3个term的文档,比包含2个词的文档更相关。

quick brown fox 将会被重写入一个bool query 像这样

GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "term": { "text": "quick" }},
        { "term": { "text": "brown" }},
        { "term": { "text": "fox"   }}
      ]
    }
  }
}

bool query 默认在所有的should条件上应用协调因子。可以禁用coordination,但是一般不这么做。query 协调因子的作用是正面的。当你使用bool query 来包装一些高级查询,比如匹配查询,使协调启用也很有意义。因为匹配了更多的条件,所以返回的都是和查询请求匹配度更高的文档。

然而,在一些高级用例中,禁用协调可能是有意义的。假设您正在寻找同义词jump、leap和hop。你不关心这些同义词有多少,因为它们都代表相同的概念。事实上,只有一个同义词很可能出现。这将是一个禁用协调因子的好例子:

GET /_search
{
  "query": {
    "bool": {
      "disable_coord": true,
      "should": [
        { "term": { "text": "jump" }},
        { "term": { "text": "hop"  }},
        { "term": { "text": "leap" }}
      ]
    }
  }
}

当你使用同义词时,在query重写的时候, es内部自动为同义词禁用了coordination。多数情况下禁用协调是自动处理的; 你不需要担心。

Index-Time Field-Level Boosting

我们将讨论如何通过Query-Time Boosting 在查询时,提高一个字段的权重,使之比其他字段更为重要。还可以在索引时间向字段应用Boost,实际上,这个权重值应用于该域的每一个term,而不是应用于域本身。

To store this boost value in the index without using more space than necessary, this field-level index-time boost is combined with the field-length norm (see Field-length norm) and stored in the index as a single byte. This is the value returned by norm(t,d) in the preceding formula.

We strongly recommend against using field-level index-time boosts for a few reasons:

  • Combining the boost with the field-length norm and storing it in a single byte means that the field-length norm loses precision. The result is that Elasticsearch is unable to distinguish between a field containing three words and a field containing five words.
  • To change an index-time boost, you have to reindex all your documents. A query-time boost, on the other hand, can be changed with every query.
  • If a field with an index-time boost has multiple values, the boost is multiplied by itself for every value, dramatically increasing the weight for that field.

Query-time boosting is a much simpler, cleaner, more flexible option.Query-time boosting is a much simpler, cleaner, more flexible option.

With query normalization, coordination, and index-time boosting out of the way, we can now move on to the most useful tool for influencing the relevance calculation: query-time boosting.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,930评论 1 332
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,642评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,928评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,639评论 0 193
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,806评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,698评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,139评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,864评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,485评论 0 230
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,955评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,355评论 1 243
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,811评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,300评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,840评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,464评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,577评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,628评论 2 249

推荐阅读更多精彩内容

  • 白状元坐在一旁,鼻子发酸,内心里莫名的出现了一种情绪,感动。“菲菲,你们姐妹有什么需要帮忙的地方,尽管找我。白状元...
    城主持剑阅读 415评论 0 4
  • 我认为孔子最令人敬佩之处便是他的“知其不可而为之”的殉道精神。“知其不可而为之”即明知做不到偏要去做,透露着一丝...
    芒茶酱阅读 1,398评论 0 3
  • 01 老六是心不甘情不愿地上城里来的。架不住六娘在家里不停地唠叨不住地哭天抢地。 “这可是你亲儿子诶,你们老曾家的...
    了了师太阅读 1,791评论 17 21