62. 全文搜索与条件查询

来源:互联网 发布:淘宝人生 编辑:程序博客网 时间:2024/04/30 08:08

全文搜索与条件查询

在59. XPages自定义控件(二)搜索视图里介绍的搜索视图控件采用的仍然是Lotus Notes系统典型的全文搜索。用户界面和操作都很简洁,只要往一个文本框里输入所要查找的文档包含的词语就可以。这一点和Internet兴起后搜索引擎的方式是一致的。不过在传统的基于关系型数据库的应用系统里,搜索更多地是以精确的条件查询形式存在的。用户在查询界面里指定若干条件,每个条件都是对当前数据模型的某个字段的值做出的限制,比如价格高于100,日期早于2003年5月2日。这些条件可以用字段-操作符-操作数的形式来概括,不同的数据类型的字段有相应的操作符,例如数字类型的有大于、等于、小于等,字符类型的有等于、包含、类似等。最后,条件之间可以用与(并且)、或(或者)的关系连接,形成复合条件。

通用的多条件查询

这样的多条件查询在面向关系型数据的应用程序里,不论是桌面的还是web的,都已经很成熟了,以至于不少公司在给客户开发的系统里都会包含一个“通用的”多条件查询功能。在查询界面上会列出当前查询可能用到的所有字段、对应的操作符,如果是选项确定的字段还会给出组合框以方便用户选择操作数,以及让用户自助式地不限数量地添加条件并且用与、或来组合生成最后的查询条件。这样的查询界面看似功能强大,实际上更多地是站在开发者的角度,看上去更像一个开发工具,给程序员开发上带来的方便多于给用户使用上的便利。因为程序员只要开发出这个万能的模块,对不同的客户就只需简单地应用即可。但是对于用户来说,很少会在一次查询里用上界面里提供的所有十几个甚至几十个字段,详尽的字段清单只会增加界面的复杂度和看上去使用的“难度”。对用户最友好的方式是他们只看到最常用的查询条件,如果不能满足要求再籍由类似展开的操作查看更多的条件。相较于原始的需要用户多次选择和输入的字段-操作符-操作数形式的条件,还可以设计一些特定的预备好的查询条件让用户直接选择,例如最近三个月创建的文档,价格介于100元和300元之间等等。Internet上很多有竞争力的电子商务网站的查询功能就体现了这样的精神。总而言之,不存在对开发人员和用户都理想的通用的查询功能,要给用户带来更多便利,提高他们使用系统时的效率,开发人员就必须花更多时间搜集和分析特定用户查询上的需求,定制出适宜他们的界面。当然这样的论点主要是针对界面而言,查询的后台程序仍然可以具有很大程度的通用性。

Lotus Notes下的多条件查询

前面说的多条件查询都是基于关系型数据库,查询条件最后都被翻译成SQL语句。Lotus Notes的文档型数据库具有完全不同的存储结构和特性,不能直接应用SQL。视图的选择条件可以类比于SQL里的SELECT语句,但是不能做SQL的多表查询,也没有GROUP等从句的强大功能,更重要的是,性能上完全不可相提并论。所以在Lotus Notes应用程序中,按字段条件查询的需求往往被引导和转化为利用视图分类和排序的功能,这也就是为什么很多Lotus Notes应用程序里有一大堆包含同样文档集合的视图。这些视图仅仅是为了给用户提供不同分类的组合,可以看成是快速的条件查询,只不过这种方式不够灵活,当要查询的字段增多时,查询条件的可能数量会以字段总数的阶乘增长,只能选择其中的少数创建分类视图。另一方面,全文索引是Lotus Notes数据库的自备功能,开启和维护都很方便,全文搜索的速度也很快,可以起到辅助视图分类和排序的作用。而且,Lotus Notes中全文搜索的查询(query)的语法远比一般使用的简单的一个或多个词语精致和强大,利用它可以指定在某个字段里包含要搜索的词,可以对数字或日期字段应用大于、等于这样的操作符,可以用通配符,设定大小写匹配……详细规则可以在Notes帮助的How can I refine a search query using operators?一文里看到。有了这个武器,我们就可以构造出和面向关系型数据库的应用程序几乎一样的多条件查询。实际上Lotus Notes客户端的视图 > 搜索当前视图命令打开的视图搜索框中的更多,即高级搜索就是给此查询语法一个图形化界面,我们也可以直接在搜索框内输入查询,例如[Topic] contains Java,就是查找Topic字段里包含Java的文档。这样的高级搜索功能虽然强大,但基本上仍然只是对开发人员有用,因为就我们最想要的按字段查找的特性,Lotus Notes给出的,而且也只能给出的,是字段的名称,很多时候这与字段在界面上的标签是不一样的,除了应用程序的开发者和维护者,一般用户根本不知道某个名称的字段的含义,例如一个名称为AnonymousAccess的字段在界面上的标签可能是Allow anonymous Notes connections也可能是允许匿名Notes连接。这还没有说到像上面的通用的多条件查询一节里提到的将字段通通列出来由用户选择是不够友好的。为了让一般用户能轻松地按字段条件查询,我们需要的是能够自定义查询界面,原则上用Lotus Notes开发的客户端和web应用程序(包括传统的web开发和现在的XPages开发)都能做到,后者因为网页可以动态修改,界面可以做得更加灵活友好。在下一篇文章里,笔者就演示一个简单的多条件查询视图的XPages自定义控件实例。