Rozbudowując pomysł Ishmaela, nie jest to ostateczne rozwiązanie, ale uważam, że to dobry sposób na rozpoczęcie.
Po pierwsze musimy uzyskać listę słów, które zostały pobrane z silnikiem pełnotekstowe:
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'
Istnieje już sporo można rozszerzyć na przykład na wzór wyszukiwania jest dość proste, ; Są też prawdopodobnie lepsze sposoby na odfiltrowanie słów, których nie potrzebujesz, ale przynajmniej daje ci listę słów łodygi itp., które zostałyby dopasowane przez wyszukiwanie pełnotekstowe.
Po uzyskaniu pożądanych wyników, można użyć polecenia RegEx, aby przeanalizować zestaw wyników (lub najlepiej tylko podzestaw, aby przyspieszyć, chociaż jeszcze nie znalazłem dobrej metody). W tym celu po prostu korzystać z dwóch pętli while i kilka tabeli tymczasowej i zmienne:
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
Kilka Uwagi:
1. Pętle zagnieżdżone natomiast prawdopodobnie nie są najbardziej skuteczny sposób to zrobić, ale nic jeszcze przychodzi mi na myśl. Gdybym używał kursorów, to w zasadzie byłaby to ta sama rzecz?
2. @FirstSearchWord
tutaj, aby odnieść się do pierwszej instancji w tekście jednego z oryginalnych słów wyszukiwania, więc zasadniczo tekst, który zastępujesz, znajduje się tylko w podsumowaniu. Ponownie, jest to dość podstawowa metoda, pewien algorytm wyszukiwania grupowego prawdopodobnie byłby przydatny.
3. Aby uzyskać RegEx w pierwszej kolejności, potrzebne są funkcje zdefiniowane przez użytkownika CLR.
http://www.sqlperformance.com/2012/09/t-sql-queries/hit-highlighting-in-full-text-search –