使用SQL Server(和/或coldfusion)创建高效的搜索功能

时间:2009-11-04 14:11:32

标签: sql-server search coldfusion search-engine

我正在尝试可视化如何为我们正在构建的应用程序创建搜索。我想建议如何通过大量数据进行“搜索”。

例如,此特定搜索将在750k记录最小表,产品sku,尺寸,材料类型,创建日期等;

有人知道Coldfusion的'插件'解决方案吗?我设想谷歌像单一条目搜索,客户可以输入部件号或尺寸等,并获得任何或所有相关结果的点击。

目前,如果我运行'LIKE'比较查询,它似乎需要很长时间(好几秒钟,但仍然),并且它太长了。有时让用户坐在那里等待10秒钟查询&页面加载。

或者是否有任何SQL公式可以帮助实现这一目标?我想使用经过验证的方法来搜索数据,而不仅仅是简单的SQL或= =比较操作。

所以这是一个多方法的问题,我应该在SQL级别进行攻击(最终看起来是这样),还是我可以获取ColdFusion的插件/模块,这将为我提供快速,高级的搜索能力。

5 个答案:

答案 0 :(得分:3)

如果你的减速特别是搜索文本字段(正如我提到LIKE所推测的那样),最好的解决方案是构建一个索引表(不要与DB表索引混淆,这也是答案的一部分)。

构建索引表,将记录的唯一ID从主表映射到文本字段的一组单词(每行1个单词)。如果重要,请在索引表中添加原始字段作为第3列,如果您想要“相关性”功能,则可能需要考虑字数。

使用触发器(使用拆分)或从应用程序填充索引表 - 后者可能更好,只需使用要插入/更新的实际数据和已拆分的单词列表调用存储过程。< / p>

这将立即大大加快文本搜索的速度,因为它将不再“LIKE”,并且能够在索引表上使用索引(没有双关语意)而不会干扰主表上的SKU等索引。

此外,确保所有相关字段完全索引 - 不一定在相同的复合索引(SKU,大小调整等...)中,以及作为范围字段搜索的任何字段(大小或日期)是聚簇索引的一个很好的候选者(只要记录按照该字段的增加的大致顺序插入,或者您不关心插入/更新速度那么多)。

对于详细的任何模式,您需要发布表结构,现有索引,慢速查询以及现在对这些慢查询的查询计划。

另一个项目是确保尽可能少的字段是文本的,特别是那些“可解码”的字段 - 你的评论在文本字段集中提到了“它是否装箱”。如果是这样,我假设值为“是”/“否”或其他一些非常有限的数据集。如果是这样,只需存储有效值的数字代码,然后在应用程序中进行编码/解码,并按数字代码进行搜索。不是一个巨大的速度改进,但仍然是一个改进。

答案 1 :(得分:3)

您可以尝试使用Verity(或Solr,如果是CF9)搜索索引数据库记录。

我不确定它会更快,甚至尝试它是否值得,将在很大程度上取决于您更新搜索所需记录的频率。如果您很少更新它们,则可以在更新它们时进行Verity Index更新。如果你不断更新记录,那将会拖累网络服务器,并且肯定会减少搜索速度的任何可能的增长。

我从来没有通过Verity索引数据库,但我已经索引了大量的PDF文档,Word文档等,我记得搜索速度非常快。我不知道它是否会对你目前的情况有所帮助,但值得进一步研究。

答案 2 :(得分:2)

我使用SQL的全文索引完成了这项工作。这将需要非常的应用程序更改,并且除了添加全文索引外,不需要更改数据库模式。

首先,将Full Text索引添加到表中。在搜索应执行的所有列中包括全文索引。我还建议让索引自动更新;除非您的SQL Server已经被高度征税,否则这不应该是一个问题。

其次,要进行实际搜索,您需要转换查询以使用全文搜索。第一步是将搜索字符串转换为全文搜索字符串。我这样做是通过将搜索字符串拆分为单词(使用Split方法),然后构建格式为的搜索字符串:

  

“Word1 *”和“Word2 *”和“Word3 *”

双引号是至关重要的;他们告诉全文索引单词的开头和结尾。

接下来,要实际执行全文搜索,请在查询中使用ContainsTable命令:

    SELECT *
    from containstable(Bugs, *, '"Word1*" AND "Word2*" AND "Word3*"')

这将返回两列:

  • 键 - 标识为全文搜索主键的列
  • 排名 - 匹配的相对排名(1 - 1000,排名越高意味着匹配越好)。

我已经多次尝试过与此类似的方法,并且我已经好运了。

答案 3 :(得分:1)

如果您想要一个真正的插件解决方案,那么您应该只使用Google本身。这听起来像你在做某种电子商务或商业网站(考虑到使用术语'SKU'),所以你可能有一个产品页面的某种目录。如果您具有一致的标记,则可以将Google设备或服务配置为完全符合您的要求。它将发送一个机器人来索引您的页面并找到您的字段。没有SQl,编码很少,它不会依赖于您的数据库,甚至是coldfusion。它对客户来说也会非常快速和熟悉。

我能用大约6个小时的冷敷现场完成这项工作!唯一需要注意的是谷歌的索引仅限于机器人可以看到的内容,所以如果您想要根据用户角色或权限或组限制访问,那么它可能不是解决方案您(虽然您可以配置Google的权限服务以进行检查)

答案 4 :(得分:-1)

由于SQL Server是您的数据所在,因此您的搜索性能可能会成为问题。确保在要搜索的列上有索引,如果使用类似的,则不能使用和索引如果执行此操作SELECT * FROM TABLEX WHERE last_name LIKE'%FR%'

但如果你这样做就可以使用索引SELECT * FROM TABLEX WHERE last_name LIKE'FR%'。这里的关键是允许尽可能多的第一个字符不是外卡。

以下是指向网站的链接,其中包含一些常规提示。 https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=173