8

SQL Server 2008을 데이터베이스로 사용하는 웹 응용 프로그램이 있습니다. 사용자는 데이터베이스의 특정 열에 대한 전체 텍스트 검색을 수행 할 수 있습니다. SQL Server의 전체 텍스트 기능은 히트 하이라이트를 지원하지 않습니다. 우리는 이것을 스스로 만들어야할까요, 아니면 어떻게 할 것인가에 관한 도서관이나 지식이 있을까요?SQL Server 전체 텍스트 쿼리의 결과 강조 표시 방법

신청서는 C#으로 작성되었으므로 .NET 솔루션은 이상적 일 수 있지만 번역 할 수는 없습니다.

+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' 

가 이미 있습니다 :

는 첫째로 우리는 전체 텍스트 엔진을 검색 한 단어의 목록을 얻을 필요 ; 또한 필요하지 않은 단어를 필터링하는 더 좋은 방법이있을 수 있지만 최소한 줄 텍스트 등의 전체 텍스트 검색과 일치하는 목록을 제공합니다.

필요한 결과를 얻은 후에는 RegEx를 사용하여 결과 집합을 분석 할 수 있습니다 (또는 수행 속도를 높이기 위해 하위 집합 만 사용하는 것이 좋지만 아직 그렇게 할 방법을 찾지 못했음). 루프 아마, 그러나 아무것도 그 일을 가장 효율적인 방법하지 않습니다 동안
1. 중첩 :

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 

몇 가지주의 사항이 들어 나는 단순히 루프 동안이 임시 테이블과 변수의 무리를 사용 그렇지 않으면 마음에 온다. 만약 내가 커서를 사용한다면, 그것은 본질적으로 같은 것이다.
여기에서 @FirstSearchWord은 원래 검색 단어 중 하나의 텍스트에서 첫 번째 인스턴스를 참조하므로 본질적으로 대체하려는 텍스트는 요약에만 포함됩니다. 다시 말하지만, 그것은 아주 기본적인 방법입니다. 일종의 텍스트 클러스터 찾기 알고리즘이 도움이 될 것입니다.
3. 먼저 RegEx를 얻으려면 CLR 사용자 정의 함수가 필요합니다.

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의 출력을 구문 분석하고 정규 표현식을 사용할 수있는 것 같습니다,하지만 난 못 봤어 너무 가깝게.

+0

당신은 이것에 대해 잘 알고있는 것처럼 원시 파일 내용 (파일 형식 "필터"를 적용)에서 텍스트를 추출하는 저장 프로 시저가 있습니까? – Guillaume86

관련 문제