2017-09-29 3 views
0

나는 큰 데이터를 가지고 있고 스포츠 주체의 예를 찾고 있는데, 스포츠 예제와 관련된 키워드의 하위 집합을 정의했다.SQL Server 전체 텍스트 검색을 사용하여 키워드 하위 집합의 키워드가 두 개 이상 필요합니다. 어떻게 수행 할 수 있습니까?

"클럽"

"놀이터"

"전문성"

"비틀림"

"목표"

검색 결과가 위의 키워드 두 개 이상의 키워드를 만족해야한다 전의. "클럽"과 "운동장"키워드는이 행이 스포츠 주제와 관련이 있음을 알리기에 충분합니다. 나는이 쿼리

select count(*) from datatable 
where contains (body,'("club" And "Playground") 
     or ("club" and "professionalism") 
     or ("club" and "torsion") 
     or ("club" and "goal") or .... or all probablities') 

을 사용하고 또한 내가 사용 :

select count(*) 
from datatable 
where 
    contains (body,'"Playground" OR "professionalism" OR "torsion" OR "goal"') 
    And contains(body,'"club" OR "professionalism" OR "torsion" OR "goal"') 
    And contains(body,'"club" OR "Playground" OR "torsion" OR "goal"') 
    And contains(body,'"club" OR "Playground" OR "professionalism" OR "goal"') 
    And contains(body,'"club" OR "Playground" OR "professionalism" OR "torsion"') 

하지만 모두

이 상황에 대한 가장 좋은 방법은 무엇

너무 느리다?

+0

두 번째 예제가 그다지 의미있는 것은 아닙니다. 실제로 정확한 결과를 가져 오나요? 첫 번째 예제는 5 개의 이름 중 3 개의 이름을 포함한다면 두 배로 계산됩니까? – ChrisM

+0

모든 항목에 두 번째 쿼리 포함 하나의 키워드가 누락되었습니다. –

+0

정확한 일치 항목 (큰 따옴표)을 찾고 있지만 CONTAINS가 수행 할 수있는 모든 기능을 제대로 활용하지 못했기 때문에 sys.dm_fts_index_keywords_by_document (https://docs.microsoft.com) .com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-fts-index-keywords-by-document-transact-sql)? 사용 권한 및 실제 사용 사례에 따라 그 작업을 수행 할 수 있습니다. (또는 정확한 답이 아닌 대략적인 답만 필요한 경우 동일한주의 사항과 함께 sys.dm_fts_index_keywords를 사용하여 작업 할 수 있습니다. – EdmCoff

답변

0

모든 조합을 나열하지 않으려면 다음과 같이 시도해 본다면 더 빠를 것이라고 생각하지만 궁금합니다. 성능이 더 나쁘지 않다면, 이걸 기반으로 단어를 추가/충전하는 것이 더 쉽다고 생각합니다.

SELECT COUNT(*) 
FROM 
(
SELECT datatable_pkey 
FROM 
(
    SELECT datatable_pkey 
    FROM datatable 
    WHERE contains (body, '"club"') 
    UNION ALL 
    SELECT datatable_pkey 
    FROM datatable 
    WHERE contains (body, '"Playground"') 
    UNION ALL 
    SELECT datatable_pkey 
    FROM datatable 
    WHERE contains (body, '"professionalism"') 
    UNION ALL 
    SELECT datatable_pkey 
    FROM datatable 
    WHERE contains (body, '"torsion"') 
    UNION ALL 
    SELECT datatable_pkey 
    FROM datatable 
    WHERE contains (body, '"goal"') 
) a 
GROUP BY datatable_pkey 
HAVING COUNT(*) > 1 
) b 
+0

노력과 시간에 감사 드리며, .it이 같은 시간이 걸리기 전에이 쿼리를 사용하고, 느린 페이징 데이터를 클라이언트에 보내면 모든 데이터를 선택한 다음 페이징을 선택하게됩니다. –

+0

충분합니다. 나는 그것이 더 빠를 것이라고 기대하지는 않았지만, DB가 최적화 할 수 있다고 생각하면 거의 같은 속도가되기를 바랐다. – EdmCoff

관련 문제