8

से परिणामों की हिट-हाइलाइटिंग कैसे करें हमारे पास एक वेब एप्लिकेशन है जो डेटाबेस के रूप में SQL Server 2008 का उपयोग करता है। हमारे उपयोगकर्ता डेटाबेस में विशेष कॉलम पर पूर्ण-पाठ खोज करने में सक्षम हैं। SQL सर्वर की पूर्ण-पाठ कार्यक्षमता हिट हाइलाइटिंग के लिए समर्थन प्रदान नहीं करती है। क्या हमें इसे स्वयं बनाने की ज़रूरत है या शायद यह कुछ पुस्तकालय या ज्ञान है कि यह कैसे करें?SQL सर्वर पूर्ण-पाठ क्वेरी

बीटीडब्ल्यू आवेदन सी ​​# में लिखा गया है, इसलिए नेट समाधान आदर्श होगा लेकिन आवश्यक नहीं है क्योंकि हम अनुवाद कर सकते हैं।

+0

http://www.sqlperformance.com/2012/09/t-sql-queries/hit-highlighting-in-full-text-search –

उत्तर

3

इश्माएल के विचार पर विस्तार, यह अंतिम समाधान नहीं है, लेकिन मुझे लगता है कि यह शुरू करने का एक अच्छा तरीका है। काफी एक बहुत कुछ एक है, पर विस्तार कर सकते हैं, उदाहरण के लिए खोज पैटर्न काफी बुनियादी है

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' 

वहां पहले से ही है:

सबसे पहले ऐसे शब्द हैं जो पूर्ण-पाठ इंजन के साथ प्राप्त किया गया है की सूची प्राप्त करने की जरूरत है ; जिन शब्दों की आपको आवश्यकता नहीं है उन्हें फ़िल्टर करने के लिए शायद बेहतर तरीके हैं, लेकिन कम से कम यह आपको स्टेम शब्द आदि की एक सूची देता है जो पूर्ण-पाठ खोज से मेल खाएगा।

आपको आवश्यक परिणाम प्राप्त करने के बाद, आप परिणाम सेट के माध्यम से रेसएक्स का उपयोग कर सकते हैं (या अधिमानतः केवल इसे गति देने के लिए एक सबसेट, हालांकि मैंने अभी तक ऐसा करने का एक अच्छा तरीका नहीं निकाला है)।

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 

कई नोट: इस के लिए मैं बस दो while लूप और अस्थायी तालिका और चर का एक गुच्छा का उपयोग
1. नेस्टेड while लूप में शायद नहीं कर के लिए सबसे कारगर तरीका है, तथापि कुछ भी नहीं कर रहे हैं और दिमाग में आता है। अगर मैं कर्सर का उपयोग करना चाहता था, तो यह अनिवार्य रूप से वही बात होगी?
2. @FirstSearchWord यहां मूल खोज शब्दों में से किसी एक के पाठ में पहले उदाहरण को संदर्भित करने के लिए संदर्भित किया गया है, इसलिए अनिवार्य रूप से जिस पाठ को आप बदल रहे हैं वह केवल सारांश में होगा। दोबारा, यह एक मूलभूत विधि है, कुछ प्रकार के टेक्स्ट क्लस्टर को एल्गोरिदम खोजना शायद आसान होगा।
3. पहली जगह RegEx प्राप्त करने के लिए, आपको सीएलआर उपयोगकर्ता परिभाषित कार्यों की आवश्यकता है।

1

आप इस उदाहरण में डेटाबेस का बिंदु खो सकते हैं। इसका काम आपको डेटा वापस करने के लिए है जो आपके द्वारा दी गई शर्तों को पूरा करता है। मुझे लगता है कि आप संभवतः अपने वेब नियंत्रण में रेगेक्स का उपयोग करके हाइलाइटिंग को कार्यान्वित करना चाहते हैं।

यहां कुछ त्वरित खोज प्रकट होगी।

http://www.dotnetjunkies.com/PrintContent.aspx?type=article&id=195E323C-78F3-4884-A5AA-3A1081AC3B35

+3

उत्तर के लिए धन्यवाद। जबकि मुझे एहसास है कि यह हाइलाइटिंग करने के लिए डेटाबेस के दायरे से बाहर है, शायद डेटाबेस को रेगेक्स इत्यादि पर भरोसा करने के बजाय हिट स्थानों आदि प्रदान करना चाहिए जो कठिन/गलत हो सकता है जब आप स्टेमिंग, स्टॉप शब्द इत्यादि के प्रभावों पर विचार करते हैं। । –

1

कुछ विवरण:

  search_kiemeles=replace(lcase(search),"""","") 
      do while not rs.eof 'The search result loop 
       hirdetes=rs("hirdetes") 
       data=RegExpValueA("([A-Za-zöüóőúéáűíÖÜÓŐÚÉÁŰÍ0-9]+)",search_kiemeles) 'Give back all the search words in an array, I need non-english characters also 
       For i=0 to Ubound(data,1) 
        hirdetes = RegExpReplace(hirdetes,"("&NoAccentRE(data(i))&")","<em>$1</em>") 
       Next 
       response.write hirdetes 
       rs.movenext 
      Loop 
      ... 

कार्य

'All Match to Array 
Function RegExpValueA(patrn, strng) 
    Dim regEx 
    Set regEx = New RegExp ' Create a regular expression. 
    regEx.IgnoreCase = True ' Set case insensitivity. 
    regEx.Global = True 
    Dim Match, Matches, RetStr 
    Dim data() 
    Dim count 
    count = 0 
    Redim data(-1) 'VBSCript Ubound array bug workaround 
    if isnull(strng) or strng="" then 
     RegExpValueA = data 
     exit function 
    end if 
    regEx.Pattern = patrn ' Set pattern. 
    Set Matches = regEx.Execute(strng) ' Execute search. 
    For Each Match in Matches ' Iterate Matches collection. 
     count = count + 1 
     Redim Preserve data(count-1) 
     data(count-1) = Match.Value 
    Next 
    set regEx = nothing 
    RegExpValueA = data 
End Function 

'Replace non-english chars 
Function NoAccentRE(accent_string) 
    NoAccentRE=accent_string 
    NoAccentRE=Replace(NoAccentRE,"a","§") 
    NoAccentRE=Replace(NoAccentRE,"á","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[aá]") 
    NoAccentRE=Replace(NoAccentRE,"e","§") 
    NoAccentRE=Replace(NoAccentRE,"é","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[eé]") 
    NoAccentRE=Replace(NoAccentRE,"i","§") 
    NoAccentRE=Replace(NoAccentRE,"í","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[ií]") 
    NoAccentRE=Replace(NoAccentRE,"o","§") 
    NoAccentRE=Replace(NoAccentRE,"ó","§") 
    NoAccentRE=Replace(NoAccentRE,"ö","§") 
    NoAccentRE=Replace(NoAccentRE,"ő","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[oóöő]") 
    NoAccentRE=Replace(NoAccentRE,"u","§") 
    NoAccentRE=Replace(NoAccentRE,"ú","§") 
    NoAccentRE=Replace(NoAccentRE,"ü","§") 
    NoAccentRE=Replace(NoAccentRE,"ű","§") 
    NoAccentRE=Replace(NoAccentRE,"§","[uúüű]") 
end function 
3

ऐसा लगता है कि आप नए SQL Server 2008 stored procedure sys.dm_fts_parser के उत्पादन को पार्स और regex का उपयोग कर सकता है, लेकिन मैं को देखा नहीं किया है यह बहुत करीब है।

+0

आप इसके बारे में जानकार लगते हैं, क्या कच्ची फ़ाइल सामग्री से टेक्स्ट निकालने के लिए एक संग्रहीत प्रक्रिया है (फ़ाइल प्रकार "फ़िल्टर" लागू करें)? – Guillaume86

संबंधित मुद्दे