分析&回答
Filter 过滤器
过滤器(filter)通常用于过滤文档的范围,比如某个字段是否属于某个类型,或者是属于哪个时间区间
- 创建日期是否在2014-2015年间?
- status字段是否为success?
- lat_lon字段是否在某个坐标的10公里范围内?
Query查询器
查询器(query)的使用方法像极了filter,但query更倾向于更准确的查找。
- 与full text search的匹配度最高
- 正则匹配
- 包含run单词,如果包含这些单词:runs、running、jog、sprint,也被视为包含run单词
- 包含quick、brown、fox。这些词越接近,这份文档的相关性就越高
查询器会计算出每份文档对于某次查询有多相关(relevant),然后分配文档一个相关性分数:_score。而这个分数会被用来对匹配了的文档进行相关性排序。相关性概念十分适合全文搜索(full-text search),这个很难能给出完整、“正确”答案的领域。
Filter与Query区别
Fiter是精确查询,对待的文档检索的结果是 是/否 ;Query对应文档检索是对文档相关性评分。
表现(性能Performance)区别:Filter返回是和条件匹配的一个简单的列表这是很快可以计算得到的并且也很容易在内存中做缓存;Query不仅要找到匹配的文档,而且还要计算每个文档的相关性(评分),这就很明显比filter花费更多的计算。
Filter与Query如何选择
- 全文搜索、评分排序,使用query;
- 是非过滤,精确匹配,使用filter。
反思&扩展
如何做到查询最优解?
- 一般情况下。尽量使用filter。。
- 过滤器不影响评分,而query得分查询会让搜索变的更加复杂,需要更多的cpu资源。
- 过滤查询相对于比较简单的操作,由于过滤应用整个索引的内容上,过滤器很容易被缓存
- 尽量使用filtered查询,可以把整个query都套在filtered中,这种效率会更快。(过滤发生在查询之前!!)
- 复杂的组合过滤查询尽量用bool查询,不带bool的查询 不能利用缓存
- 设置search_type 类型
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!