2013-12-09 4 views
11

예를 들어 검색 할 텍스트 데이터가 4 열인 검색 테이블이 있습니다.여러 열과 술어에 대해 CONTAINS가 포함 된 전체 텍스트 검색 - AND

나는 같은 것을 할 : 는 용어 1 및 용어 2가 같은 열에있는 경우 사실를 돌려줍니다처럼

SELECT * FROM dbo.SearchTable 
WHERE CONTAINS((co1, col2, col3, col4), 'term1 AND term2') 

것 같습니다. AND로 모든 열을 포함하도록 지정하는 방법이 있습니까?

그렇지 않다면 제 생각에는 모든 검색 열을 JSON으로 연결하여 하나에 집어 넣는 것입니다. 그렇게하면 전체 텍스트를 검색 할 수 있지만 .NET에서 개별 열을 쉽게 추출 할 수 있습니다. 나는 인덱서가 이것에 문제가 없으며 JSON 문자와 따옴표를 사용하지 않을 것이라고 추정한다. 이 올바른지?

감사

편집

json으로 아이디어를 생각 크롤러는 또한 인덱스 속성 이름은 그래서 {이름}, {세부}, {long_details} 뭔가 이름을 변경해야 할 것이다 것 검색에서 선택되지 않도록 {x1}, {x2}, {x3}과 (와) 같이 표시됩니다. 그들이 너무 짧으면 어쨌든 색인을 생성하지 않기를 바랍니다.

EDIT2

I 시스템 중지 목록을 기반으로 Stoplist을 만들고 그에 속성 이름을 넣을 수 있습니다.

답변

12

이 작동합니다 :

SELECT * FROM dbo.SearchTable 
WHERE CONTAINS((co1, col2, col3, col4), 'term1') 
AND CONTAINS((co1, col2, col3, col4), 'term2'); 

또는, 당신은에서 전체 텍스트 인덱스와 새로운 계산 된 열을 추가 할 수 있습니다. 이 같은 열을 추가

computedCol AS col1 + ' ' + col2 + ' ' + col3 + ' ' + col4 

그리고 전체 텍스트 인덱스를 만들 :

CREATE FULLTEXT INDEX ON SearchTable (computedCol LANGUAGE 1033) 
KEY INDEX pk_SearchTable_yourPrimaryKeyName 

이 그럼 당신은이 작업을 수행 할 수 있습니다

SELECT * FROM dbo.SearchTable 
WHERE CONTAINS(*, 'term1 AND term2') 
+0

안녕하세요, 감사합니다. 나는 검색어를 구문 분석하고 쿼리를 동적으로 작성해야하기 때문에 첫 번째 옵션이 마음에 들지 않습니다 (가능하면 검색을 1 개의 내용으로 결합해야 함). 계산 된 열에 대해 더 많이 읽어야합니다. 나는 그들이 지속될 수 있다고 생각하지만, 나는 두 배나 많은 양의 데이터를 저장하려고한다. 계속 유지되지 않으면 쿼리 시간에 많은 영향을 미칩니 까? –

+4

값 중 하나가 null 인 SQL의 문자열 연결은 전체 표현식을 null로 바꿉니다. "isnull (col, '')"와 같이 isnull을 사용하여 각 nullable 용어를 래핑하여이 문제를 해결할 수 있습니다. –