Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

搜索和筛选的区别

  有一个概念一直都没有明确的定义,什么是搜索?什么是筛选?搜索和筛选有什么区别?我觉得,搜索是从一个未知边界集合中寻找符合条件的数据,而筛选则是在一个已知范围内寻找符合条件的数据。那么什么是未知边界?什么是已知范围呢?感觉越想越乱吧?
  数据库中的表可以根据其预估数据量和数据增长速度来评定规模。这里为了方面表述,将能接受全表扫描的表称为小规模表,不能接受的称为大规模表。
  对于大规模表,我们很难统计它到底有多少条记录。这时候对于程序而言它就是一个未知边界的集合,对它的直接查询就属于搜索级的。而小规模的表可以接受全表扫描,于是无论多么复杂的查询条件都可以查,因为它已经不依赖索引了,这便是筛选。
  当我们在做一个大列表展示时经常会遇到分页的问题。分页控件一般都是显示一堆页码,然后前后还有一个「首页」和「尾页」的链接。然而对于大规模表而言,查询表中的记录条数是不容易的。也许可以通过触发器监控表的 insert 和 delete 操作,在其它地方记录表的记录数。但如果查询数量时还带条件的话那就真没办法实现了。所以大规模表的前端展示都不提供「尾页」这个按钮,也不显示总页数,甚至连快速跳页也不提供(因为序号越大的记录查询成本越高,不希望用户浏览后面的页码)。
  既然大规模表是一个未知边界集合,那么对大规模表的查询就属于搜索么?其实一些简单索引可以从大规模表中取出部分数据,而这部分数据是小规模的,我们可以在通过简单索引取出的这部分小规模数据上肆无忌惮地做各种无索引查询。所以大规模表的查询未必都是搜索。真正的搜索概念在一般的开发中并不多,至少比起筛选而言是非常少的。大部分时候我们都使用筛选,只有在一些特殊的场景下才会动用搜索这种东西。比如分词全文索引、记录条数估算,等这些带有模糊色彩的东西。
  筛选可能只需要 SQL 中 WHERE 带上条件即可,这里扯 SQL 只是为了方便表述这个概念。可能实际实现根本不使用 WHERE 子句而在程序中写一个 for 循环,甚至根本不使用关系数据库。至于搜索那就要复杂得多了,可能就需要另一套完整的体系协助才能做到。从另一个方面看的话,筛选总是非常精确的,而搜索则本身就可能是模糊的。
  以上是我个人的理解,不服来撕。。
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^