性能优化:
短语查询和邻近查询都比简单的 query
查询代价更高 。 一个 match
查询仅仅是看词条是否存在于倒排索引中,而一个 match_phrase
查询是必须计算并比较多个可能重复词项的位置。
match query的性能比match_phrase和proximity match(有slop)要高很多,因为后两者都要计算position的距离。
match query比match_phrase的性能要高10倍,比proximity match(带slop的)性能要高20倍。
rescore 是重新评分机制
主要思路:
用match query先过滤出需要的数据,然后再用proximity match来根据term距离提高doc分数,同时proximity match只针对每个shard的分数排名前N个doc起作用,来重新调整他们的分数,这个过程称之为rescoring(重打分)。
默认情况下,match也许匹配了1000个doc,proximity match全都需要对每个doc进行一遍运算,判断能否slop移动匹配上,然后去贡献自己的分数,但是很多情况下,match出来也许1000个doc,其实用户大部分情况下是分页查询的,所以可能最多只会看前几页,比如一页是10条,最多也许就看5页,就是50条。
proximity match只要对前50条doc进行slop移动去匹配,去贡献自己的分数即可,不需要对全部1000个doc都去进行计算和贡献分数。
GET /my_index/my_type/_search
{
"query": {
"match": { 1
"title": {
"query": "quick brown fox",
"minimum_should_match": "30%"
}
}
},
"rescore": {
"window_size": 50, 2
"query": { 3
"rescore_query": {
"match_phrase": {
"title": {
"query": "quick brown fox",
"slop": 50
}
}
}
}
}
}
1 |
|
2 |
|
3 | 目前唯一支持的重新打分算法就是另一个查询,但是以后会有计划增加更多的算法。 |