इश्माएल के विचार पर विस्तार करना, यह अंतिम समाधान नहीं है, लेकिन मुझे लगता है कि यह शुरू करने का एक अच्छा तरीका है।
सबसे पहले हमें उन शब्दों की सूची प्राप्त करने की आवश्यकता है जिन्हें पूर्ण-पाठ इंजन के साथ पुनः प्राप्त किया गया है:
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 का उपयोग कर सकते हैं (या अधिमानतः इसे गति देने के लिए केवल एक सबसेट, हालांकि मुझे अभी तक ऐसा करने का एक अच्छा तरीका नहीं मिला है)। इसके लिए मैं बस दो जबकि लूप और अस्थायी तालिका और चर का एक गुच्छा उपयोग करता हूं:
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. @FirstSearchWord
यहां मूल खोज शब्दों में से किसी एक के पाठ में पहली आवृत्ति को संदर्भित किया गया है, इसलिए अनिवार्य रूप से आपके द्वारा प्रतिस्थापित किया जा रहा पाठ केवल सारांश में होगा। फिर से, यह काफी बुनियादी तरीका है, किसी प्रकार का टेक्स्ट क्लस्टर फाइंडिंग एल्गोरिथम शायद आसान होगा।
3. RegEx को पहले स्थान पर लाने के लिए, आपको CLR उपयोगकर्ता-परिभाषित फ़ंक्शन की आवश्यकता है।