一、match和phrase match(proximity match)区别

 

1、match:只要简单的匹配到了一个term,就会将term对应的doc作为 结果返回。

2、phrase match :
首先扫描到所有term的doc list; 找到包含所有term的doc list; 然后对每个doc都计算每个term的position,然后进行复杂的计算,看这些position是否符合查询指定的slop范围。如果都符合,才作为结果返回。

3、match query的性能比phrase match和proximity match(有slop)要高很多。因为后两者都要计算position的距离。官方称:match query比phrase match的性能要高10倍,比proximity match的性能要高20倍。但是我们也别太担心,因为es的性能一般都在毫秒级别,match query一般就在几毫秒,或者几十毫秒,而phrase match和proximity match的性能在几十毫秒到几百毫秒之间,所以也是可以接受的。

 
 

二、match + proximity match使用时性能优化

 
 

1、思路和基本做法

优化proximity match的性能,主要思路是减少要进行proximity match搜索的document数量,这也符合用户使用行为,一般用户会分页查询,只会看到前几页的数据,所以不需要对所有结果进行proximity match操作。比如:match查询出来也许1000个doc,其实用户大部分情况下是分页查询的,所以可能最多只会看前几页,比如一页是10条,最多也许就看5页,就是50条

proximity match只要对前50个doc进行slop移动去匹配然后贡献分数即可,不需要对全部1000个doc都去进行计算和贡献分数。

主要做法是:用match query先过滤出需要的数据,然后再用proximity match来根据term距离提高doc的分数,同时proximity match只针对每个shard的分数排名前n个doc起作用,来重新调整它们的分数,这个过程称之为rescoring(重计分)。而不需要对marth查询出来的全部doc进行移动打分,从而提高性能

 
 

2、语法

 
 

 
 

GET /forum/article/_search

{

"query": {

"match": {

"content": "java spark"

}

},

"rescore": {

"window_size": 50,

"query": {

"rescore_query": {

"match_phrase": {

"content": {

"query": "java spark",

"slop": 50

}

}

}

}

}

}

 
 

"window_size": 50, 表示告知es用户只需要前50个数据。

最新文章

  1. 相关query挖掘
  2. Linux下如何自己编译源代码(制作成可以安装的.deb文件)
  3. MAC地址是什么
  4. phpcms分页用法简介
  5. 兼容ie8 rgba()用法 滤镜filter的用法
  6. 4-JS对象
  7. html网页标题
  8. 单链表反转的递归实现(Reversing a Linked List in Java, recursively)
  9. Branch management
  10. mysql 复习与学习(二)数据库及表结构的创建删除
  11. ArcEngine做栅格数据拉伸
  12. hdu 3290 (简单dfs)
  13. #js#简单的在线计算器
  14. ftp_get_file_and_directory
  15. SQL Server on Red Hat Enterprise Linux——RHEL上的SQL Server(全截图)
  16. [leetcode-575-Distribute Candies]
  17. 【杂】暴力出奇迹,lz水数据
  18. SQLite3问题
  19. [leetcode.com]算法题目 - Sort Colors
  20. Spring之事务操作(注解)

热门文章

  1. checkbox是否选中判断
  2. how to use webpart container in kentico
  3. ASP.NET 4 and Visual Studio 2010
  4. WCF Odata 开放数据协议应用
  5. codeforces 939F 单调队列优化dp
  6. 收集主机OS相关数据
  7. bzoj1106
  8. 02_jni_hello_c函数介绍
  9. vs2010 下使用C#开发activeX控件
  10. PCB Genesis 外形加内角孔实现方法