8

SQL Server 2008をデータベースとして使用するWebアプリケーションがあります。ユーザーは、データベース内の特定の列について全文検索を行うことができます。 SQL Serverのフルテキスト機能は、ヒットの強調表示をサポートしていないようです。これを自分で構築する必要があるのでしょうか、あるいはこれを行う方法に関するライブラリや知識がありますか?SQL Serverのフルテキストクエリのヒットハイライト表示方法

申し訳ありませんが、アプリケーションはC#で書かれているため、.Netソリューションは理想的ですが、翻訳することはできません。

+0

http://www.sqlperformance.com/2012/09/t-sql-queries/hit-highlighting-in-full-text-search –

答えて

3

イシマエルのアイデアをエキスパンドして、それは最終的な解決策ではありませんが、それは良い方法だと思います。

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

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' 

1がオンに拡張することができますかなり多くは、例えば、検索パターンは非常に基本的で、既に存在してい;おそらくあなたが必要としない単語をフィルタリングするためのより良い方法がありますが、少なくともそれは全文検索で一致するような幹語などのリストを提供します。

必要な結果が得られたら、結果セットを解析するためにRegExを使用することができます(または、できるだけ早くそれを実行するためのサブセットのみを解析することができます。

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.ループはおそらくそれを行うための最も効率的な方法ではありませんしながら、ネストされた、しかし何もこのために私は単にループと一時テーブルと変数の束ながら2を使用しますそれ以外は気になります。私がカーソルを使用する場合、それは本質的に同じだろうか?
2.ここでは、元の検索語の1つのテキストの最初のインスタンスを参照するため、本質的に置き換えようとしているテキストのみが要約に含まれます。繰り返しますが、それはかなり基本的な方法です。何らかの種類のテキストクラスタ検索アルゴリズムが便利かもしれません。
3.最初にRegExを取得するには、CLRユーザー定義関数が必要です。

1

この場合、データベースのポイントが不足している可能性があります。その仕事は、あなたが与えた条件を満たすデータをあなたに返すことです。おそらくあなたのWebコントロールでregexを使ってハイライトを実装したいと思うでしょう。

クイック検索で明らかになるものがあります。

http://www.dotnetjunkies.com/PrintContent.aspx?type=article&id=195E323C-78F3-4884-A5AA-3A1081AC3B35

+3

返信いただきありがとうございます。ハイライトを行うのはデータベースの範囲外であることに気付いているかもしれませんが、おそらくデータベースはヒットした場所などを提供する必要があります。ステミングやストップワードなどの効果を考慮すると、正規表現などに頼る必要はありません。 。 –

1

いくつかの詳細:

  search_kiemeles=replace(lcase(search),"""","") 
      do while not rs.eof 'The search result loop 
       hirdetes=rs("hirdetes") 
       data=RegExpValueA("([A-Za-zöüóőúéáűíÖÜÓŐÚÉÁŰÍ0-9]+)",search_kiemeles) 'Give back all the search words in an array, I need non-english characters also 
       For i=0 to Ubound(data,1) 
        hirdetes = RegExpReplace(hirdetes,"("&NoAccentRE(data(i))&")","<em>$1</em>") 
       Next 
       response.write hirdetes 
       rs.movenext 
      Loop 
      ... 

機能

'All Match to Array 
Function RegExpValueA(patrn, strng) 
    Dim regEx 
    Set regEx = New RegExp ' Create a regular expression. 
    regEx.IgnoreCase = True ' Set case insensitivity. 
    regEx.Global = True 
    Dim Match, Matches, RetStr 
    Dim data() 
    Dim count 
    count = 0 
    Redim data(-1) 'VBSCript Ubound array bug workaround 
    if isnull(strng) or strng="" then 
     RegExpValueA = data 
     exit function 
    end if 
    regEx.Pattern = patrn ' Set pattern. 
    Set Matches = regEx.Execute(strng) ' Execute search. 
    For Each Match in Matches ' Iterate Matches collection. 
     count = count + 1 
     Redim Preserve data(count-1) 
     data(count-1) = Match.Value 
    Next 
    set regEx = nothing 
    RegExpValueA = data 
End Function 

'Replace non-english chars 
Function NoAccentRE(accent_string) 
    NoAccentRE=accent_string 
    NoAccentRE=Replace(NoAccentRE,"a","§") 
    NoAccentRE=Replace(NoAccentRE,"á","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[aá]") 
    NoAccentRE=Replace(NoAccentRE,"e","§") 
    NoAccentRE=Replace(NoAccentRE,"é","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[eé]") 
    NoAccentRE=Replace(NoAccentRE,"i","§") 
    NoAccentRE=Replace(NoAccentRE,"í","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[ií]") 
    NoAccentRE=Replace(NoAccentRE,"o","§") 
    NoAccentRE=Replace(NoAccentRE,"ó","§") 
    NoAccentRE=Replace(NoAccentRE,"ö","§") 
    NoAccentRE=Replace(NoAccentRE,"ő","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[oóöő]") 
    NoAccentRE=Replace(NoAccentRE,"u","§") 
    NoAccentRE=Replace(NoAccentRE,"ú","§") 
    NoAccentRE=Replace(NoAccentRE,"ü","§") 
    NoAccentRE=Replace(NoAccentRE,"ű","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[uúüű]") 
end function 
3

新しいSQL Server 2008 stored procedure sys.dm_fts_parserの出力を解析し、正規表現を使用することができますように見えますが、私は見ていませんそれは近すぎる。

+0

あなたはこれに精通しているようですが、生ファイル内容からテキストを抽出するストアドプロシージャはありますか?(ファイルタイプ "フィルタ"を適用します)? – Guillaume86

関連する問題