# Rescoring

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-rescore.html#_multiple_rescores](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-rescore.html#_multiple_rescores)

译文链接 : [http://www.apache.wiki/pages/editpage.action?pageId=4883098](http://www.apache.wiki/pages/editpage.action?pageId=488308)

贡献者 : [ping](/display/~wangyangting)

重新计算可以通过使用次要（通常是更昂贵的）算法来重新排序查询和 post_filter 阶段返回的顶部（例如100-500）个文档，而不是对索引中的所有文档应用昂贵的算法来帮助提高精度。

在返回其结果以由处理整个搜索请求的节点排序之前，在每个分片上执行 rescore 请求。

目前 rescore API 只有一个实现：查询 rescorer，它使用查询来调整评分。 在将来，可以提供备选的分配器，例如，成对分配器。

Note：

当使用排序时不执行 rescore 阶段。

Note：

当向用户展示分页时，您不应该在逐步浏览每个页面（通过传递不同的值）时更改window_size，因为这可能会改变顶部匹配，导致结果在用户逐步浏览页面时发生混乱。

### Query rescorer

查询rescorer仅对查询和post_filter阶段返回的Top-K结果执行第二个查询。 将在每个分片上检查的文档数量可以由window_size参数控制，默认为from和size。

默认情况下，原始查询和rescore查询的分数线性组合，以产生每个文档的最终_score。 原始查询和rescore查询的相对重要性可以分别使用query_weight和rescore_query_weight进行控制。 两者默认为1。

例如：

```
curl -s -XPOST 'localhost:9200/_search' -d '{
   "query" : {
      "match" : {
         "field1" : {
            "operator" : "or",
            "query" : "the quick brown",
            "type" : "boolean"
         }
      }
   },
   "rescore" : {
      "window_size" : 50,
      "query" : {
         "rescore_query" : {
            "match" : {
               "field1" : {
                  "query" : "the quick brown",
                  "type" : "phrase",
                  "slop" : 2
               }
            }
         },
         "query_weight" : 0.7,
         "rescore_query_weight" : 1.2
      }
   }
}
'
```

组合得分的方式可以用 score_mode 控制：

| Score Mode  | Description |
| --- | --- |
| `total` | 添加原始分数和 rescore 查询分数。 默认值。 |
| `multiply` | 将原始分数乘以 rescore 查询分数。 用于函数查询 rescores。 |
| `avg` | 平均原始分数和 rescore 查询分数。 |
| `max` | 取最初的分数和 rescore 查询分数。 |
| `min` | 取最初的分数和 rescore 查询分数。 |

### Multiple Rescores

也可以按顺序执行多个资源：

```
curl -s -XPOST 'localhost:9200/_search' -d '{
   "query" : {
      "match" : {
         "field1" : {
            "operator" : "or",
            "query" : "the quick brown",
            "type" : "boolean"
         }
      }
   },
   "rescore" : [ {
      "window_size" : 100,
      "query" : {
         "rescore_query" : {
            "match" : {
               "field1" : {
                  "query" : "the quick brown",
                  "type" : "phrase",
                  "slop" : 2
               }
            }
         },
         "query_weight" : 0.7,
         "rescore_query_weight" : 1.2
      }
   }, {
      "window_size" : 10,
      "query" : {
         "score_mode": "multiply",
         "rescore_query" : {
            "function_score" : {
               "script_score": {
                  "script": {
                    "lang": "painless",
                    "inline": "Math.log10(doc['numeric'].value + 2)"
                  }
               }
            }
         }
      }
   } ]
}
'
```

第一个获得查询的结果，第二个获得第一个的结果等。第二个 rescore 将 “see” 由第一个 rescore 完成排序，因此可以在第一个 rescore 上使用大窗口 将文档拖动到较小的窗口中，以便第二个文件。