2

バックグラウンド

私は現在、数年前に急いで最初に書いた検索エンジンを書き直しています:)

現在、検索には、ユーザー、組織、ニュースの見出しなど、最大 5 つの異なる内部ビジネス オブジェクト/テーブルが含まれます。したがって、ユーザー"The Quick Brown Fox"が検索ボックスに入力すると、各タイプのビジネス オブジェクトの結果が得られます。

各ビジネス オブジェクトにはspSearchUsersspSearchOrganizations、 などのストアド プロシージャが関連付けられています。

問題

ここで、検索ごとに、各ストアド プロシージャを (BL -> データ アクセス レイヤー経由で) ビジネス オブジェクト タイプごとに複数回呼び出しています。たとえば、ユーザーが を検索する場合、"The Quick Brown Fox"文字列全体を変更せずに送信しますが、文字列をスペースごとに分割し、各単語を個別に検索します。

この場合、各ストアド プロシージャは 5 回呼び出され、1 回の検索で合計 25 回のデータベース呼び出しが行われます。私はこれが典型的ではないように感じます...しかし、それでもかなり速く実行されます。1 回の検索に約 4 ~ 5 秒かかります。

作りたいもの

単一の「マスター」ストアド プロシージャは、検索文字列全体を取得"The Quick Brown Fox"し、個々のビジネス オブジェクト ストアド プロシージャ ( 、 など) を呼び出しspSearchUsersspSearchOrganizations少しのロジックを実行し、1 つの結果セットを返します。

つまり、1 回の検索で 1 回の結果が得られます。

これは、ストアド プロシージャ、関数、および/またはユーザー定義のテーブル型を使用して実現できますか?

4

2 に答える 2

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 に答える
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 に答える