문제

SQL 백엔드가있는 C#/asp.net 앱을 구축하고 있습니다. 마감일에 내 페이지를 마무리하고 있습니다. 왼쪽 필드에서 내 디자이너 중 한 명이 내 페이지 중 하나에 전체 텍스트 검색을 통합했습니다. 이 시점까지 내 "검색"은 필터가되어 특정 요소와 열 값으로 설정된 결과를 좁힐 수 있습니다.

내가 마감일에 있기 때문에 (당신은 고양이가 먹고 던진 것 같은 시점에서 밤에 3 시간 동안 잠을 자고 있다는 것을 알고 있습니다), 나는이 페이지가 다른 사람들과 매우 비슷 할 것으로 기대하고 있으며, 나는 노력하고 있습니다. 악취를 내야하는지 여부를 결정합니다. 나는 전에 한 페이지에서 전체 텍스트 검색을 한 적이 없다 .... 이것은 산가 올라가는 산입니까, 아니면 간단한 해결책이 있습니까?

감사합니다.

도움이 되었습니까?

해결책

먼저, 프로덕션 서버에서 전체 텍스트 검색 인덱싱을 활성화해야하므로 범위가 아닌 경우이를 사용하고 싶지 않을 것입니다.

그러나 이미 준비가된다면 전체 텍스트 검색은 비교적 간단합니다.

T-SQL에는 전체 텍스트 검색에 사용되는 4 개의 사전 대상이 있습니다.

  • 무료 문자
  • freetexttable
  • 포함
  • 포함 가능

freetext는 가장 간단하며 다음과 같이 수행 할 수 있습니다.

SELECT UserName
FROM Tbl_Users
WHERE FREETEXT (UserName, 'bob' )

Results:

JimBob
Little Bobby Tables

freetexttable은 결과를 테이블로 반환하는 것을 제외하고는 freetext와 동일하게 작동합니다.

T-SQL의 전체 텍스트 검색의 진정한 힘은 포함 된 (그리고 containstable) 술어에서 나옵니다.

CONTAINS
    ( { column | * } , '< contains_search_condition >' 
    ) 

< contains_search_condition > ::= 
        { < simple_term > 
        | < prefix_term > 
        | < generation_term > 
        | < proximity_term > 
        | < weighted_term > 
        } 
        | { ( < contains_search_condition > ) 
        { AND | AND NOT | OR } < contains_search_condition > [ ...n ] 
        } 

< simple_term > ::= 
    word | " phrase "

< prefix term > ::= 
    { "word * " | "phrase * " }

< generation_term > ::= 
    FORMSOF ( INFLECTIONAL , < simple_term > [ ,...n ] ) 

< proximity_term > ::= 
    { < simple_term > | < prefix_term > } 
    { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ] 

< weighted_term > ::= 
    ISABOUT 
        ( { { 
                < simple_term > 
                | < prefix_term > 
                | < generation_term > 
                | < proximity_term > 
                } 
            [ WEIGHT ( weight_value ) ] 
            } [ ,...n ] 
        ) 

이것은 다음과 같은 쿼리를 쓸 수 있음을 의미합니다.

SELECT UserName
FROM Tbl_Users
WHERE CONTAINS(UserName, '"little*" NEAR tables')

Results:

Little Bobby Tables

행운을 빕니다 :)

다른 팁

SQL Server에서의 전체 텍스트 검색은 쿼리 사이드에서 약간의 구성 및 약간의 조정이기 때문에 쉽습니다. 20 분 이내에 고객을 위해이 과정에 익숙해졌습니다.

여기에 있습니다 2008 MSDN 기사, 링크는 2005 년 버전으로 이동합니다.

파일 및 데이터베이스에 전문 검색을 추가하기 전에 DTSearch를 사용했으며 그 물건은 매우 저렴하고 사용하기 쉽습니다.

이 모든 것을 추가하고 SQL을 구성하지 않으면이 스크립트는 데이터베이스의 모든 열을 검색하고 원하는 열에 원하는 값이 포함되어 있는지 알려줍니다. 나는 그것의 "적절한"솔루션이 아니라는 것을 알고 있지만 시간을 구입할 수 있습니다.

/*This script will find any text value in the database*/
/*Output will be directed to the Messages window. Don't forget to look there!!!*/

SET NOCOUNT ON
DECLARE @valuetosearchfor varchar(128), @objectOwner varchar(64)
SET @valuetosearchfor = '%staff%' --should be formatted as a like search 
SET @objectOwner = 'dbo'

DECLARE @potentialcolumns TABLE (id int IDENTITY, sql varchar(4000))

INSERT INTO @potentialcolumns (sql)
SELECT 
    ('if exists (select 1 from [' +
    [tabs].[table_schema] + '].[' +
    [tabs].[table_name] + 
    '] (NOLOCK) where [' + 
    [cols].[column_name] + 
    '] like ''' + @valuetosearchfor + ''' ) print ''SELECT * FROM [' +
    [tabs].[table_schema] + '].[' +
    [tabs].[table_name] + 
    '] (NOLOCK) WHERE [' + 
    [cols].[column_name] + 
    '] LIKE ''''' + @valuetosearchfor + '''''' +
    '''') as 'sql'
FROM information_schema.columns cols
    INNER JOIN information_schema.tables tabs
        ON cols.TABLE_CATALOG = tabs.TABLE_CATALOG
            AND cols.TABLE_SCHEMA = tabs.TABLE_SCHEMA
            AND cols.TABLE_NAME = tabs.TABLE_NAME
WHERE cols.data_type IN ('char', 'varchar', 'nvchar', 'nvarchar','text','ntext')
    AND tabs.table_schema = @objectOwner
    AND tabs.TABLE_TYPE = 'BASE TABLE'
ORDER BY tabs.table_catalog, tabs.table_name, cols.ordinal_position

DECLARE @count int
SET @count = (SELECT MAX(id) FROM @potentialcolumns)
PRINT 'Found ' + CAST(@count as varchar) + ' potential columns.'
PRINT 'Beginning scan...'
PRINT ''
PRINT 'These columns contain the values being searched for...'
PRINT ''
DECLARE @iterator int, @sql varchar(4000)
SET @iterator = 1
WHILE @iterator <= (SELECT Max(id) FROM @potentialcolumns)
BEGIN
    SET @sql = (SELECT [sql] FROM @potentialcolumns where [id] = @iterator)
    IF (@sql IS NOT NULL) and (RTRIM(LTRIM(@sql)) <> '')
    BEGIN
        --SELECT @sql --use when checking sql output
        EXEC (@sql)
    END
    SET @iterator = @iterator + 1
END

PRINT ''
PRINT 'Scan completed'

나 거기 가봤 어. 각각 하나의 다른 가중치 값을 제공하여 여러 열에서 검색과 같은 확장 성 및 고급 검색 기능을 고려하기 시작할 때까지 매력처럼 작동합니다.

예를 들어, 검색하는 유일한 방법입니다 제목 그리고 요약 열은 계산 된 열을 가지고 있습니다 SearchColumn = CONCAT(Title, Summary) 그리고 색인 오버 SearchColumn. 가중치? SearchColumn = CONCAT(CONCAT(Title,Title), Summary) 그런 것. ;) 필터링? 잊어 버려.

"얼마나 힘든가?"는 대답하기 어려운 질문입니다. 예를 들어, 이미 그것을 10 번 한 사람은 아마도 그것을 스냅이라고 생각할 것입니다. 내가 정말로 말할 수있는 것은 당신이 같은 것을 사용하면 훨씬 쉽게 찾을 수 있다는 것입니다. nlucene 자신을 굴리는 대신.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top