2

背景

我目前正在重写一个搜索引擎......我最初是在几年前匆忙写的:)

今天,搜索包含约 5 种不同的内部业务对象/表:用户、组织、新闻标题等。因此,当用户在"The Quick Brown Fox"搜索框中键入时,他/她将获得每种类型的业务对象的结果。

每个业务对象都有一个关联的存储过程:spSearchUsersspSearchOrganizations等。

问题

现在,对于每次搜索,我为每种业务对象类型多次调用每个存储过程(通过 BL -> 数据访问层)。例如,当用户搜索 时"The Quick Brown Fox",我将整个字符串原封不动地发送下来,但也将字符串拆分为每个空格,并单独搜索每个单词。

在这种情况下,每个存储过程被调用 5 次……对于一次搜索,总共需要 25 个单独的数据库调用。我不觉得这是典型的......但它仍然运行得很快。每次搜索大约需要 4-5 秒。

我想创造什么

单个“主”存储过程获取整个搜索字符串"The Quick Brown Fox",该字符串依次调用每个单独的业务对象存储过程(spSearchUsersspSearchOrganizations等),执行一点逻辑,并返回 1 个结果集。

所以 1 个搜索... 1 个结果。

这可以使用存储过程、函数和/或用户定义的表类型来实现吗?

4

2 回答 2

0

如果您使用的是 Ms-Sql,您可以创建一个全文索引,允许您使用所有术语进行搜索,而无需更改文本。此外,存储过程可以返回多个结果集,因此您可以创建一个新的存储过程来运行每个查询并返回所有记录,或者单独调用所有以前的存储过程(如下所示)。

CREATE PROCEDURE [dbo].[DoMassiveSearch]
@searchText varchar(200) = null
AS
BEGIN
  EXEC spSearchUsers @searchText

  EXEC spSearchOrganizations @searchText
END
于 2012-10-29T19:49:29.207 回答
0

假设您可以创建这样的视图

CREATE VIEW vSearchFields
as

    SELECT "U" as tableName, IDUser as ID, UserName as searchField 
    FROM USERS

UNION

    SELECT "O" as tableName, IDOrganizations as ID, OrgName as searchField
    FROM Organizations

UNION

    SELECT 'N' as tableName, IDNews as ID, newsText as searchField
    FROM News 

UNION

    SELECT 'H' as tableName, IDHeadline as ID, headlineText as searchField
    FROM Headlines

现在您可以编写一个简单的存储过程来搜索 seachField 中的文本

CREATE PROCEDURE [dbo].[searchText]
@textToSearch nvarchar(2000)
AS
BEGIN
    SELECT * FROM vSearchFields WHERE searchField = @textToSearch
END

下一步将引入一个函数来拆分输入文本并使用文本部分进行重复搜索,或者,如果您的数据库版本允许(2008 年及之后),使用表值参数将拆分的字符串作为从 C# 代码到存储过程的表。

T-SQL
表值参数中的拆分函数

于 2012-10-29T20:54:33.577 回答