ES 搜索10 (match、match_phrase 性能优化)

性能优化:

短语查询和邻近查询都比简单的 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

match 查询决定哪些文档将包含在最终结果集中,并通过 TF/IDF 排序。

2

window_size 是每一分片进行重新评分的顶部文档数量。

3

目前唯一支持的重新打分算法就是另一个查询,但是以后会有计划增加更多的算法。

你可能感兴趣的:(ES)