Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर पूर्ण-पाठ क्वेरी से परिणामों की हिट-हाइलाइटिंग कैसे करें

इश्माएल के विचार पर विस्तार करना, यह अंतिम समाधान नहीं है, लेकिन मुझे लगता है कि यह शुरू करने का एक अच्छा तरीका है।

सबसे पहले हमें उन शब्दों की सूची प्राप्त करने की आवश्यकता है जिन्हें पूर्ण-पाठ इंजन के साथ पुनः प्राप्त किया गया है:

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 उपयोगकर्ता-परिभाषित फ़ंक्शन की आवश्यकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर इंडेक्स फ़्रेग्मेंटेशन को ठीक करने के लिए टिप्स

  2. SQL में एक शीर्ष स्तरीय अभिभावक ढूँढना

  3. डेटाटाइम को फ्लोट में कनवर्ट करते समय SQL का कन्वर्ट फ़ंक्शन कैसे काम करता है?

  4. SQL सर्वर:PARTITION BY और GROUP BY के बीच अंतर

  5. अधिकतम (गिनती ()) खोजने के लिए SQL में उप-प्रश्नों का उपयोग करना