イシュマエルの考えを拡張すると、それは最終的な解決策ではありませんが、始めるのに良い方法だと思います。
まず、フルテキストエンジンで取得された単語のリストを取得する必要があります。
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ユーザー定義関数が必要です。