我正在构建一个基于许多属性搜索人员的工具。这些属性的值分散在多个系统中。
例如,dateOfBirth作为系统ABC的一部分存储在SQL Server数据库中。该人的销售区域分配存储在一些可怕的遗留数据库中。其他属性存储在只能通过XML Web服务访问的系统中。
更糟糕的是,遗留数据库和Web服务可能非常慢。
在所有这些系统中实施搜索时,我应该考虑哪些策略和提示?
注意:虽然我发布了一个答案,但我并不确定这是一个很好的答案。除非没有其他人提供更好的见解,否则我不打算接受我自己的答案。
答案 0 :(得分:4)
您可以考虑使用索引机制来检索所有系统中的数据并对其进行本地索引,然后针对索引执行搜索。搜索会更快,更可靠。
当然,这只是将问题从系统的一个部分转移到另一个部分 - 现在您的索引机制必须处理故障和异构系统,但这可能是一个更容易解决的问题。
另一个因素是数据变化的频率。如果您必须非常快速地实时查询数据,那么索引可能不切实际。
答案 1 :(得分:1)
如果您可以逃脱限制性搜索,请首先根据与最快数据源对应的搜索条件返回列表。然后将这些记录与其他系统连接起来,并删除与搜索条件不匹配的记录。
如果你必须实现OR逻辑,这种方法不会起作用。
答案 2 :(得分:1)
虽然不是一个真正的答案,但这至少可以帮助您找到可行的解决方案。我们在之前的雇主处遇到过类似情况 - 许多数据来源,访问这些数据源的不同方式,不同的访问权限,军事/政府/民用来源等等。我们使用了Mule,这是围绕企业建立的Service Bus概念,用于将这些数据源连接到我们的应用程序。我的细节有点粗略,因为我不是实际的实现者,只是一个集成商,但我们所做的是在Mule中定义一个频道。然后,您可以编写一个简单的集成部分,用于在通道和数据源之间,以及应用程序和通道之间。集成部分完成了实际查询和格式化结果的工作,因此我们有一个用于访问数据库的通用SQL集成部件,对于像Web服务这样的东西,我们有一些实现了通用功能的基类,所以实际上集成piecess的定制工作远比听起来要少得多。然后,应用程序可以查询通道,该通道将处理访问各种数据源,将它们转换为XML的标准化位,并将结果返回给应用程序。
这对我们的情况有很多好处。我们可以通过简单地将它们连接到通道来包含现有查询的新数据源 - 应用程序不必知道或关心那里的数据源,因为它只查看来自通道的数据。由于可以从通道推送或提取数据,因此我们可以让数据源更新应用程序,例如,更新时。
它需要一段时间才能完成配置和工作,但是一旦我们开始工作,我们就非常成功。在我们的演示设置中,我们最终有4或5个应用程序充当数据的生产者和消费者,并连接到可能的10个数据源。
答案 3 :(得分:0)
您是否考虑过将数据移动到单独的结构中?
例如,Lucene将要搜索的数据存储在无模式反向索引中。您可以使用单独的程序从所有不同的源检索数据并将它们放入Lucene索引中。您的搜索可能会对此索引起作用,搜索结果可能包含唯一标识符及其来源的系统。
http://lucene.apache.org/java/docs/ (还有其他语言的实现)
答案 4 :(得分:0)
你看过YQL了吗?它可能不是一个完美的解决方案,但我可能会给你起点。
答案 5 :(得分:0)
嗯,对于初学者,我会将查询并行化到不同的系统。这样我们可以最小化查询时间。
您可能还想考虑缓存和聚合后续查询的搜索属性,以加快速度。
您可以选择创建聚合所有不同系统的聚合服务或中间件,以便为查询提供单一界面。如果你这样做,这就是我在前面提到的缓存和并行优化的地方。
然而,考虑到所有这些,您需要权衡开发时间/部署时间/长期优势,以便将旧的旧数据库迁移到更快速的现代数据库。你还没有说过如何将这些数据库与其他系统联系起来,因此在短期内它可能不是一个非常可行的选择。
编辑:回应数据过时。如果您不需要数据始终与数据库实时匹配,则可以考虑缓存数据。此外,如果某些数据不经常更改(例如出生日期),那么您应该缓存它们。如果您使用缓存,那么您可以使系统可以配置要包含或从缓存中排除的表/列,并且可以为每个表/列提供具有总体默认值的个性化缓存超时。
答案 6 :(得分:0)
使用Pentaho / Kettle复制您可以搜索并显示到本地MySQL数据库的所有数据字段
http://www.pentaho.com/products/data_integration/
创建批处理脚本以便每晚运行并更新本地副本。也许甚至每个小时。然后,针对本地MySQL数据库编写查询并显示结果。