Разширявайки идеята на Исмаил, това не е окончателното решение, но мисля, че е добър начин да започнете.
Първо трябва да получим списъка с думи, които са били извлечени с машината за пълен текст:
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, за да анализирате набора от резултати (или за предпочитане само подмножество, за да го ускорите, въпреки че все още не съм измислил добър начин да го направя). За това просто използвам два цикъла 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
here to се отнася до първата инстанция в текста на една от оригиналните думи за търсене, така че по същество текстът, който замествате, ще бъде само в резюмето. Отново, това е доста основен метод, някакъв алгоритъм за намиране на текстови клъстери вероятно би бил удобен.
3. За да получите RegEx на първо място, имате нужда от CLR потребителски дефинирани функции.