0

키워드 분석기 기반 Lucene.NET 인덱스를 SQL Server 2008 R2 기반 쿼리로 대체하려고합니다.SQL 전체 텍스트 인덱서, 정확한 일치 및 이스케이프

내가 쿼리해야하는 사용자 지정 인덱싱 된 필드가 포함 된 테이블이 있습니다. 인덱스 열의 값 (아래 참조)은 일련의 .NET 형식에서 가져온 사용자 지정 인덱스 필드의 이름/값 쌍의 조합입니다. 구조가 알려지지 않았기 때문에 실제 값은 런타임에 특성에서 가져옵니다.

AND 및 OR을 사용하여 이름 및 값 쌍을 검색하고 쿼리가 일치하는 행을 반환 할 수 있어야합니다. 이 같은

Id   Index 
==================================================================== 
1   [Descriptor.Type]=[5][Descriptor.Url]=[/] 
2   [Descriptor.Type]=[23][Descriptor.Url]=[/test] 
3   [Descriptor.Type]=[25][Descriptor.Alternative]=[hello] 
4   [Descriptor.Type]=[26][Descriptor.Alternative]=[hello][Descriptor.FriendlyName]=[this is a test] 

간단한 쿼리보기 :

select * from Indices where contains ([Index], '[Descriptor.Url]=[/]'); 

다음과 같은 오류가 발생합니다 즉, 쿼리, 나는 Index의 데이터를 염두에 너무

Msg 7630, Level 15, State 2, Line 1 
Syntax error near '[' in the full-text search condition '[Descriptor.Url]=[/]'. 

변경 열 [] 대신 |을 사용하려면 :

이제는 해당 쿼리가 유효하지만 실행하면 정확하게 일치하는 레코드 (이 경우 정확히 하나) 대신 및 /으로 시작하는 모든 행이 반환됩니다.

내 질문은 어떻게 쿼리가 []을 설명하고 바로 정확한 일치하는 행이 반환을 보장하기 위하여 탈출 할 수있다?

A는 더 복잡한 쿼리는 작은 다음과 같습니다

select * from Indices where contains ([Index], '[Descriptor.Type]=[12] AND ([Descriptor.Url]=[/] OR [Descriptor.Url]=[/test])'); 

감사합니다,
Kieron 사용

답변

1

주요 문제는 SQL 단어 분리기 및 CONTAINS 구문을 사용하는 것입니다. 기본적으로 SQL 단어 분리기는 구두점을 제거하고 숫자, 날짜, URL, 전자 메일 주소 등을 표준화합니다. 그것은 또한 모든 것을 소문자로 바꾸고 단어를 줄입니다.

그래서, 당신의 입력 문자열 :

[Descriptor.Type]=[5][Descriptor.Url]=[/]

당신은 인덱스에 추가 한 다음 토큰을 것

descriptor type nn5 5 descriptor url

(주 (자신의 위치와 함께) 다음 NN5는 방식이다 원래의 번호도 같은 위치에 색인되어있다.)

자, 볼 수 있듯이, punctutation은 전체 t에도 저장되지 않는다. ext 인덱스가 없으므로 CONTAINS 문을 사용하여 쿼리 할 수 ​​없습니다.

그래서 문 :

select * from Indices where contains ([Index], '|Descriptor.Url|=|/|'); 

실제로 "기술자"가 모든 항목에 따라서, 전체 텍스트 인덱스에 안타를 제출하기 전에 쿼리 생성기에 의해 "기술자 URL"을 아래로 정상화 될 것이다 구두점을 제외하고 "url"옆에.

LIKE statement이 필요합니다.

0

"|" 구분 기호에 따라 포함 된 쿼리가 OR을 생각하게됩니다. 그래서 예상치 못한 결과가 발생합니다. 다음과 같이 대괄호를 벗어날 수 있어야합니다.

SELECT * FROM Indices WHERE 
    contains ([Index], '[[]Descriptor.Type]=[[]12]') 
+0

나는 그것을 시도했지만 가장 큰 걱정은 잘못된 결과가 반환된다는 것입니다. 감사. – Kieron

+0

'[* 색인], [[] Descriptor.Url] = [[] /] ')을 포함하는 색인에서'select *'오류는 무엇입니까? 파이프를 사용하여 수정하기 전에 쿼리가 데이터에서 올바르게 실행되어야합니다. 일단 데이터를 파이프로 변경하면 이제 |를 벗어나야합니다. 쿼리는 다음과 같이 보일 것입니다 :'select * from Indices where ([Index], 'Descriptor.Url \ | = \ |/\ | ESCAPE'\ ');'- db를 가지고 있습니다. – Prescott

+0

문제는 너무 많이 벗어나지 않습니다. 필요하다면 구분 기호를 변경할 수 있습니다. 주요 문제는 반환 된 결과가 예상대로되지 않습니다. – Kieron