计划研究一下搜索search,然后写个学习过程系列博客。开动之前先说说学习搜索的目的:不是想开发个什么搜索引擎,而是想用现成的搜索引擎在传统信息系统中引进搜索的概念和方法。对我来说,传统的管理系统legacy i.t system已经走到了尽头。根本原因是信息在量上的爆发增长,传统数据管理方式已经无法兼顾了。在我看来,除了交易管理,传统的关系数据库方式在业务管理的其它方面,特别是业务相关的数据分析、决策支持等肯定是力不从心了,这些从持续多年我所经历的数据库红色锁标记就很有说服力了。无可否认,必须想办法在大数据、分布式计算方面寻找合适的解决方案。前两年已经完成了一系列分布式计算、分布式数据库,分布式流处理等博客,足够构建一个分布式大数据平台来实现对海量数据的存储、处理了。剩下最重要的问题是如何使用平台上的这些数据,即如何能轻松又高效的使用大数据,否则前面一切努力将化为乌有。现在最迫切的需求(我认为的)就是如何对这些大数据进行高效的分析、关联,组合然后产生全面、精准的业务决策或者系统使用的支持数据。也就是说可以通过搜索把大数据平台上的数据按照业务管理要求的信息内容、表现形式提供给前端系统。
首先解释一下:传统业务管理系统里的查询(查找)与搜索有较大区别。传统系统采用查询方式来筛选系统里符合条件的交易记录。之所以提到交易记录是因为传统系统中数据的强格式化,连带查询条件的设置也较僵化、缺乏灵活性。由于查询结果是通过对查询条件的高度匹配产生的,往往需要查询者充分了解业务特性才能准确的表述需求形成条件,这也是大多数操作者无法具备的能力,造成查询工具的实用性大打折扣。
搜索search除条件匹配式的查找外最重要的是具备了关联relevance的特性。首先,搜索是基于大数据文件数据库的,对格式没有硬性要求,操作者可自由、灵活的表达搜索条件。再者搜索具备信息关联能力,能根据搜索条件除符合条件的文件外,还能把满足搜索条件中表述的关联,如:文字关联、意思关联、信息关联等应用在目标文件的匹配上,产生一个以关联度排序的结果文件清单。换句话说就是好的1搜索方案还可以猜度操作者的搜索目的,提供建议目标结果。如此大大降低了对使用者操作水平的要求,最终任何用户普遍都可以轻松使用搜索来获取符合专业要求的搜索结果。
考虑了一下市面上的几个开源搜索引擎,最终选择了elasticsearch。除了搜索功能外,elasticsearch还是一个分布式的数据库。当然,我们不会采用elasticsearch的数据库存取功能,因为已经选择了mongodb作为大数据平台数据库。所以,最终的系统结构是一个mongodb+elasticsearch的搜索平台:mongodb存储原始业务数据,elasticsearch负责对这些业务数据进行索引构建。
从结构上说:elasticsearch的操作可以分为后台批次型的索引构建(indexing)及前端实时的索引管理及搜索,包括对索引的CRUD,这些是通过elasticsearch提供的api来实现的。如上所述,elasticsearch也是某种数据库管理系统,提供了多种语言的客户端驱动,包括java。但后面我们会用elastic4s:一个开源的scala elasticsearch客户端,根据各种业务搜索场景,调用elasticsearch的各种api来实现行业专用的搜索功能。