matchphrase match(proximity match)区别
match —> 只要简单的匹配到了一个term,就可以理解将term对应的doc作为结果返回,扫描倒排索引,扫描到了就ok
phrase match —> 首先扫描到所有termdoc list; 找到包含所有termdoc list; 然后对每个doc都计算每个termposition,是否符合指定的范围; slop,需要进行复杂的运算,来判断能否通过slop移动,匹配一个doc
match query的性能比phrase matchproximity match(有slop)要高很多。因为后两者都要计算position的距离。
match queryphrase match的性能要高10倍,比proximity match的性能要高20倍。
但是别太担心,因为es的性能一般都在毫秒级别,match query一般就在几毫秒,或者几十毫秒,而phrase matchproximity match 的性能在几十毫秒到几百毫秒之间,所以也是可以接受的。
优化proximity match的性能,一般就是减少要进行proximity match搜索的document数量。主要思路就是,用match query 先过滤出需要的数据,然后再用 proximity match 来根据term距离提高doc的分数,同时proximity match 只针对每个shard 的分数排名前ndoc起作用,来重新调整它们的分数,这个过程称之为rescoring,重计分。因为一般用户会分页查询,只会看到前几页的数据,所以不需要对所有结果进行proximity match操作。
用我们刚才的说法,match + proximity match同时实现召回率和精准度
默认情况下,match也许匹配了1000个docproximity match 全都需要对每个doc 进行一遍运算,判断能否slop 移动匹配上,然后去贡献自己的分数
但是很多情况下,match出来也许1000个doc,其实用户大部分情况下是分页查询的,所以可能最多只会看前几页,比如一页是10条,最多也许就看5页,就是50条
proximity match 只要对前50个doc进行slop移动去匹配,去贡献自己的分数即可,不需要对全部1000doc都去进行计算和贡献分数

问题:如果只对前面 50doc 进行 slop 移动匹配,有没有可能后面 950doc 在进行 slop 移动匹配后更加的精准呢?

rescore:重打分
match1000doc,其实这时候每个doc都有一个分数了; proximity match,前50doc,进行rescore,重打分,即可; 让前50docterm举例越近的,排在越前面

  1. GET /forum/_search
  2. {
  3. "query": {
  4. "match": {
  5. "content": "java spark"
  6. }
  7. },
  8. "rescore": {
  9. "window_size": 50,
  10. "query": {
  11. "rescore_query": {
  12. "match_phrase": {
  13. "content": {
  14. "query": "java spark",
  15. "slop": 50
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }

https://www.cnblogs.com/gmhappy/p/11864048.html