1

テキスト文字列を渡すことができ、キーワードのテーブルからテキスト内の特定のキーワード(タグ)を識別するSQLプロシージャが必要です。

これまでのところ、1つの単語に対して非常にうまく機能する次のものがあります。

INSERT INTO #tags SELECT Word 
FROM dbo.SplitWords('some colours are blue, green, red and light blue')

SELECT Word
FROM    #tags
INTERSECT
SELECT  Tag
FROM    dbo.Tags

DROP TABLE #tags

タグテーブルに「緑」、「赤」、「青」のエントリがある場合、期待どおりに返されます。

私が知りたいのは、同様の結果をどのように達成できるかということですが、複数の単語であるタグの場合...たとえば、「水色」

上記のコードで私が抱えている問題は、ソーステキストを個々の単語に分割しているため、「水色」が一致しないことですが、カーソルなどを呼び出さない別のルートがありますか?

ご協力いただきありがとうございます


次のことが私が必要とするものを達成するだろうとちょうど気づきました

DECLARE @Text as nvarchar(max)

SELECT @Text = 'some colours are blue, green, red and light blue'

SELECT  TagID, 
    Tag 
FROM    Tags 
WHERE   @Text LIKE '% ' + Tag + ' %' 
ORDER BY Tag

しかし、テーブルに数千行あり、検索するテキスト文字列が非常に長い場合、非効率になる可能性があるのではないかと心配しています。

同じプロセスをより効率的に行う方法について誰かが考えていますか?

4

2 に答える 2

0

OK、再考する時間ができるまで、または問題が発生するのを待つまで、以前の解決策に落ち着きました。古い方法では実行に時間がかかりすぎているため、別の解決策を見つける必要があります。

私が見つけた(実行時間の長さの点で)最良の解決策をいくつかプレイした後、それをカーソルにすることです....

そのため、テキストを検索したいフレーズにカーソルを設定し、そのカーソルを通過させて、一致するフレーズ ID を一時テーブルに入力します。FAST_FORWARD および FORWARD_ONLY 設定を使用してパフォーマンスを最大化することが重要です。

完了したら、一時テーブルを db テーブルに結合して、必要なフレーズの詳細を返すだけです。

以下のコード例:

DECLARE @PageText nvarchar(max) -- ページ テキストのパラメータ

CREATE TABLE #Matches (PhraseID int)

DECLARE @PhraseID int DECLARE @PhraseText nvarchar(100)

DECLARE curMatchingPhrases CURSOR FAST_FORWARD FORWARD_ONLY FOR SELECT p.PhraseID, p.PhraseText FROM フレーズ p

OPEN curMatchingPhrases

FETCH NEXT FROM curMatchingPhrases INTO @PhraseID、@PhraseText

WHILE @@FETCH_STATUS = 0 BEGIN

IF EXISTS (SELECT 'match' WHERE @PageText LIKE '% ' + @PhraseText + ' %')
BEGIN
    INSERT #Matches SELECT  @PhraseID
    WHERE   @PhraseID NOT IN (SELECT PhraseID FROM #Matches)
END

FETCH NEXT FROM curMatchingPhrases INTO @PhraseID, @PhraseText 

終わり

CLOSE curMatchingPhrases DEALLOCATE curMatchingPhrases

SELECT * FROM #Matches

DROP TABLE #Matches

ここにいる他の人はもっとエレガントな解決策を見つけることができると確信していますが、カーソルは6秒以上のSPを0〜1秒に減らしたので、今のところ満足しています.

モジョ

于 2012-11-26T23:37:57.577 に答える
0

TSQLに関する私の回答を確認してください- A join using fulltext CONTAINS

@Conrad のアイデアを活用していますが、CONTAINS の変数の制限を超えています。

于 2012-05-09T18:10:53.013 に答える