sql >> データベース >  >> RDS >> Sqlserver

SQLServerフルテキストクエリの結果をヒットハイライト表示する方法

    イシュマエルの考えを拡張すると、それは最終的な解決策ではありませんが、始めるのに良い方法だと思います。

    まず、フルテキストエンジンで取得された単語のリストを取得する必要があります。

    declare @SearchPattern nvarchar(1000) = 'FORMSOF (INFLECTIONAL, " ' + @SearchString + ' ")' 
    declare @SearchWords table (Word varchar(100), Expansion_type int)
    insert into @SearchWords
    select distinct display_term, expansion_type
    from sys.dm_fts_parser(@SearchPattern, 1033, 0, 0)
    where special_term = 'Exact Match'
    

    拡張できるものはすでにかなりたくさんあります。たとえば、検索パターンは非常に基本的です。また、不要な単語を除外するためのより良い方法もおそらくありますが、少なくとも、全文検索で一致する語幹単語などのリストが表示されます。

    必要な結果が得られたら、RegExを使用して結果セットを解析できます(または、サブセットのみを使用して速度を上げることができますが、これを行うための適切な方法はまだわかりません)。このために、2つのwhileループと、一連の一時テーブルと変数を使用します。

    declare @FinalResults table 
    while (select COUNT(*) from @PrelimResults) > 0
    begin
        select top 1 @CurrID = [UID], @Text = Text from @PrelimResults
        declare @TextLength int = LEN(@Text )
        declare @IndexOfDot int = CHARINDEX('.', REVERSE(@Text ), @TextLength - dbo.RegExIndexOf(@Text, '\b' + @FirstSearchWord + '\b') + 1)
        set @Text = SUBSTRING(@Text, case @IndexOfDot when 0 then 0 else @TextLength - @IndexOfDot + 3 end, 300)
    
        while (select COUNT(*) from @TempSearchWords) > 0
        begin
            select top 1 @CurrWord = Word from @TempSearchWords
            set @Text = dbo.RegExReplace(@Text, '\b' + @CurrWord + '\b',  '<b>' + SUBSTRING(@Text, dbo.RegExIndexOf(@Text, '\b' + @CurrWord + '\b'), LEN(@CurrWord) + 1) + '</b>')
            delete from @TempSearchWords where Word = @CurrWord
        end
    
        insert into @FinalResults
        select * from @PrelimResults where [UID] = @CurrID
        delete from @PrelimResults where [UID] = @CurrID
    end
    

    いくつかの注意事項:
    1。ネストされたwhileループは、おそらく最も効率的な方法ではありませんが、他に何も思い浮かびません。カーソルを使うとしたら、基本的に同じことになるのでしょうか?
    2。 @FirstSearchWord ここでは、元の検索ワードの1つのテキストの最初のインスタンスを参照しているため、基本的に、置き換えるテキストは要約にのみ含まれます。繰り返しになりますが、これは非常に基本的な方法であり、ある種のテキストクラスター検索アルゴリズムがおそらく便利です。
    3。そもそも正規表現を取得するには、CLRユーザー定義関数が必要です。



    1. Oracleの日付が週末かどうかを判断しますか?

    2. MySQLmy.cnfファイルを編集する方法

    3. MATCHAGAINSTの複数の列

    4. グループ化された現在の合計のための最良のアプローチ