다음을 통해 공유


ISearchQueryHelper를 사용하여 인덱스 쿼리

ISearchQueryHelper 인터페이스를 사용하여 인덱스를 쿼리할 수 있습니다. 이 인터페이스는 ISearchCatalogManager(및 ISearchCatalogManager2)에 대한 도우미 클래스로 구현되며 ISearchCatalogManager::GetQueryHelper를 호출하여 가져옵니다. 이 인터페이스를 사용하면 다음을 수행할 수 있습니다.

  • Windows Search 데이터베이스에 연결할 OLE DB 연결 문자열을 가져옵니다.
  • AQS(고급 쿼리 구문) 사용자 쿼리를 Windows Search 구조적 쿼리 언어(SQL)로 변환합니다.
  • SQL에서 표현할 수 있지만 AQS에서는 표현할 수 없는 쿼리 제한을 지정합니다.

이 항목은 다음과 같이 구성됩니다.

ISearchQueryHelper를 사용하여 시작

ISearchQueryHelper 인터페이스를 사용하여 프로그래밍 방식으로 Windows Search 쿼리를 시작하기 전에 알아야 할 몇 가지 주요 인터페이스와 메서드가 있습니다. 개략적으로 다음 단계를 수행해야 합니다.

  1. ISearchManager instance 인스턴스화합니다.

    // Create ISearchManager instance
    ISearchManager* pSearchManager;
    
    // Use library SearchSDK.lib for CLSID_CSearchManager.
    hr = CoCreateInstance(CLSID_CSearchManager, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pSearchManager));      
    
  2. ISearchManager::GetCatalog를 사용하여 ISearchCatalogManager의 instance 가져옵니다. Windows Search의 시스템 카탈로그 이름은 입니다 SYSTEMINDEX.

    // Create ISearchCatalogManager instance 
    ISearchCatalogManager* pSearchCatalogManager;
    
    // Call ISearchManager::GetCatalog for "SystemIndex" to access the catalog to the ISearchCatalogManager
    hr = pSearchManager->GetCatalog(L"SystemIndex", &pSearchCatalogManager);
    
    
  3. ISearchCatalogManager::GetQueryHelper를 사용하여 ISearchQueryHelper의 instance 가져옵니다.

    // Call ISearchCatalogManager::GetQueryHelper to get the ISearchQueryHelper interface
    ISearchQueryHelper* pQueryHelper;
    
    hr = pSearchCatalogManager->GetQueryHelper(&pQueryHelper);
    
    
  4. ISearchQueryHelper의 instance Windows Search 인덱스 OLE DB 커넥터에 연결하는 데 사용되는 연결 문자열을 가져올 수 있습니다.

    // Call get_ConnectionString to get the OLE DB connection string
    LPWSTR pszConnectionString=NULL;
    
    hr = pQueryHelper->get_ConnectionString(&pszConnectionString);
    // NOTE: YOU MUST call CoTaskMemFree() on the string
    
    

GenerateSqlFromUserQuery 메서드 사용

ISearchQueryHelper::GenerateSQLFromUserQuery 메서드는 사용자 입력을 SQL 쿼리 문자열로 변환한 다음 Windows Search용 OLE DB 공급자에 제출할 수 있습니다. 이 메서드는 사용자가 입력한 AQS( 고급 쿼리 구문 ) 또는 NQS(자연 쿼리 구문) 쿼리를 SQL로 변환하고 필요에 따라 다른 SQL 조각을 추가할 수 있습니다.

SQL 쿼리 문자열은 다음 형식으로 반환됩니다.

SELECT <QuerySelectColumns> 
FROM <CatalogName that created query helper>
WHERE <Result of interpreting the user query passed into this function according to QuerySyntax>
      [ AND|OR <QueryWhereRestrictions> ]
    

다음은 호출 GenerateSQLFromUserQuery("comput")에서 반환된 SQL 문자열의 예입니다.

SELECT "System.ItemUrl" 
FROM "SystemIndex" 
WHERE ((CONTAINS(*,'"comput*"',1033) RANK BY COERCION(Absolute, 1)) OR 
       (FREETEXT(("System.ItemNameDisplay":0.9, *:0.1), 'comput', 1033) AND CONTAINS(*,'"comput"',1033)))
ORDER BY "System.ItemUrl"

참고

CONTAINS만으로는 의미 있는 순위를 생성하지 않으므로 메서드는 FREETEXT와 CONTAINS 조건자를 모두 생성합니다.

 

로캘 식별자 작업

메서드 설명
ISearchQueryHelper::get_QueryContentLocale/
ISearchQueryHelper::p ut_QueryContentLocale
쿼리의 LCID(언어 코드 식별자)를 가져오고 넣습니다. 이렇게 하면 올바른 단어 분리기 및 형태소 분석기가 쿼리 용어를 카탈로그/반전된 인덱스와 비교할 수 있습니다. 기본값은 현재 입력 로캘입니다.
ISearchQueryHelper::get_QueryKeywordLocale/
ISearchQueryHelper::p ut_QueryKeywordLocale
AQS(고급 쿼리 구문 분석) 키워드를 구문 분석할 때 사용할 언어의 LCID를 가져오고 넣습니다. 기본값은 기본 사용자 로캘입니다.

 

콘텐츠 로캘키워드(keyword) 로캘은 검색 엔진이 쿼리 용어의 언어와 AQS 키워드 언어를 식별하여 올바른 단어 분리기를 사용하는 데 도움이 되는 LCID(로캘 식별자)입니다. Windows Search는 여러 국제 버전에서 제공되며 더 많은 언어를 위한 MUI(다국어 사용자 인터페이스) 팩도 포함되기 때문에 항상 동일한 CID는 아닙니다. 콘텐츠 로캘은 사용자가 검색 쿼리를 입력하는 언어의 LCID를 식별하는 반면, 키워드(keyword) 로캘은 검색 엔진이 AQS(고급 쿼리 구문) 키워드를 구문 분석할 때 사용하는 LCID를 식별합니다.

예를 들어 MUI 팩이 없는 영어-미국 버전이 있는 경우 콘텐츠 로캘과 키워드(keyword) 로캘은 모두 1033입니다. MUI 팩이 없는 독일어 버전이 있는 경우 콘텐츠 로캘과 키워드(keyword) 로캘은 모두 1031(gr-gr)입니다. 그러나 루마니아어 MUI 팩을 사용하는 영어 버전이 있는 경우 콘텐츠 로캘은 2072(ro)이고 키워드(keyword) 로캘은 1033(en-us)입니다.

속성 및 열 작업

메서드 Description
ISearchQueryHelper::get_QueryContentProperties/
ISearchQueryHelper::p ut_QueryContentProperties
검색의 콘텐츠 속성(CONTAINS 또는 FREETEXT 절에 나열된 속성 열)을 가져오거나 설정합니다.
ISearchQueryHelper::get_QuerySelectColumns/
ISearchQueryHelper::p ut_QuerySelectColumns
SELECT 문에서 요청된 열(또는 속성)을 가져오거나 설정합니다. 기본값은 System.ItemUrl 및 WHERE 절에 사용되는 속성입니다.

 

항목은 속성 저장소에 행으로 표시됩니다. 각 행에는 해당 항목의 속성을 나타내는 여러 열이 포함되어 있습니다. 모든 항목에 지정된 속성에 대한 값이 있는 것은 아닙니다. 예를 들어 오디오 파일은 일반적으로 System.Property.FromName 속성에 대한 값을 포함하지 않지만 System.Music.Artist에 대한 정보를 포함할 수 있습니다.

이러한 메서드를 사용하면 속성 저장소의 열 이름을 하나 이상 지정하는 쉼표로 구분된 null로 끝나는 유니코드 문자열인 "System.Document.Author, System.Document.Title"을 사용하여 속성에 액세스하거나 수정합니다.

쿼리 용어 확장 작업

메서드 설명
ISearchQueryHelper::get_QueryTermExpansion
ISearchQueryHelper::p ut_QueryTermExpansion
검색 용어 확장 플래그를 가져오/설정합니다.

 

이 메서드를 사용하면 정규식 확장과 유사한 야생 카드 문자를 사용하여 일부 쿼리 용어를 확장할 수 있습니다. 접두사 확장은 접두사(재미/깔때기)가 동일한 단어를 검색합니다. 설정하지 않으면 기본값이 SEARCH_TERM_PREFIX_ALL. SEARCH_TERM_EXPANSION 열거형의 지원되는 값은 다음과 같습니다.

  • SEARCH_TERM_PREFIX_ALL - 모든 검색어 확장
  • SEARCH_TERM_NO_EXPANSION - 확장된 검색어 없음

다른 ISearchQueryHelper 메서드 작업

ISearchQueryHelper 인터페이스의 많은 메서드는 쿼리 인수를 설정하거나 반환된 속성을 정의하는 데 사용됩니다.

메서드 설명
ISearchQueryHelper::get_ConnectionString
OLE DB 연결 문자열을 반환합니다. 올바른 형식의 올바른 연결 문자열을 가져오는 기본 방법입니다.
ISearchQueryHelper::get_QueryMaxResults
ISearchQueryHelper::p ut_QueryMaxResults
쿼리에서 반환할 최대 결과 수(즉, SELECT TOP n)를 가져오/설정합니다. 기본값은 -1입니다. 즉, 최대 결과 절이 생성되지 않습니다.
ISearchQueryHelper::get_QuerySorting
ISearchQueryHelper::p ut_QuerySorting
쿼리 결과 집합의 정렬 순서(ORDER BY)를 가져오/설정합니다. ORDER BY 절이 없으면 결과가 비결정적 순서로 반환됩니다.
ISearchQueryHelper::get_QuerySyntax
ISearchQueryHelper::p ut_QuerySyntax
쿼리 구문(고급 쿼리 구문 또는 자연 쿼리 구문)을 가져오거나 설정합니다.
ISearchQueryHelper::get_QueryWhereRestrictions
ISearchQueryHelper::p ut_QueryWhereRestrictions
WHERE 절을 통해 추가된 제한을 가져오/설정합니다.

 

프로그래밍 방식으로 인덱스 쿼리

SQL 및 AQS 접근 방식을 사용하여 인덱스 쿼리

search-ms 프로토콜을 사용하여 인덱스 쿼리

Windows Search SQL 구문을 사용하여 인덱스 쿼리

프로그래밍 방식으로 고급 쿼리 구문 사용