【问题标题】:Looking for a SQL Server system-wide search solution寻找 SQL Server 系统范围的搜索解决方案
【发布时间】:2016-05-22 20:01:52
【问题描述】:

我正在尝试创建一个解决方案,以允许我的用户对我的数据库中的记录执行类似 google 的搜索。我的意思是,他们可以在不指定列的情况下以多种方式搜索数据。这里有几点可以理解我的结构和规格。

  • 用户应该能够搜索任何关键字
  • 数据将通过内部连接来自多个表
  • 数据不断变化,搜索结果必须是实时的

今天我是这样完成的:

每次记录或相应记录发生更改时,我们都会在 searchindex 表中创建一条记录,其中包含与该记录关联的所有相关关键字。例如,库存记录将包含收据编号、订单编号、库存状态等,所有这些都将用于连接表。 searchindex 表使用 SQL Server 全文索引进行索引,并且运行良好。

问题:

当前设置的问题是我们必须维护 searchindex 表中的数据。这意味着每次在我们的代码中当任何数据发生变化时,我们都需要调用一个存储过程来更新searchindex。由于我们的应用程序很复杂,这太麻烦了,而且经常失败。

我想实现一个更流畅的解决方案,以便搜索索引不断更新。

有什么想法吗?

谢谢。

【问题讨论】:

  • 您绝对不会对这种类型的搜索感到满意。您基本上是在询问是否有一种方法可以搜索每个表的每一列以找到特定值,并且您希望它快速。这就像要求某人在加利福尼亚州的所有电话簿中找到“史蒂夫”这个名字的所有出现。可以做到,但不会很快。
  • 我建议保留您当前的解决方案,并在非高峰时段每天更新一次 searchindex 表。
  • @SeanLange 我并不是要求每一列都可搜索。只有几个,但它们在不同的表中
  • 有一个计划的进程更新一个单独的表,如 Tab 所说。我知道您说“实时”是一项要求,但这实际上无法做到。您必须在实时或实时之间做出选择。
  • 要在高峰时段进行更新,您可以考虑使用分区切换解决方案。

标签: sql sql-server search full-text-search


【解决方案1】:

您可以使用视图来消除对必须不断更新的单个表的需求。比如:

CREATE VIEW Full_Search
AS
    SELECT invoice_number AS search_text, 'Invoices' AS table_name, 'invoice_number' AS column_name, invoice_id AS id
    UNION ALL
    SELECT part_number AS search_text, 'Parts' AS table_name, 'part_number' AS column_name, part_id AS id
    ...

然后,您可以搜索视图以找到匹配的表、列和行。这依赖于您的所有表都具有一个单列的 PK,以便它们可以混合在一起。

性能很大程度上取决于搜索的完成方式。如果搜索允许使用索引(例如,没有WHERE search_text LIKE '%value%'),那么性能可能不会那么差。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 2011-07-06
    • 1970-01-01
    • 2014-07-20
    • 2017-07-27
    • 1970-01-01
    • 2011-03-10
    • 2012-12-01
    相关资源
    最近更新 更多