ISearchQueryHelper를 사용하여 인덱스 쿼리

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

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

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

ISearchQueryHelper 시작하기

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

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

    // 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 인스턴스를 가져옵니다. 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 인스턴스를 가져옵니다.

    // Call ISearchCatalogManager::GetQueryHelper to get the ISearchQueryHelper interface
    ISearchQueryHelper* pQueryHelper;
    
    hr = pSearchCatalogManager->GetQueryHelper(&pQueryHelper);
    
    
  4. ISearchQueryHelper인스턴스가 있으면 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::put_QueryContentLocale
쿼리의 LCID(언어 코드 식별자)를 가져오거나 놓습니다. 이렇게 하면 올바른 단어 분리기 및 형태소 분석기를 사용하여 쿼리 용어를 카탈로그/반전된 인덱스와 비교할 수 있습니다. 기본값은 현재 입력 로캘입니다.
ISearchQueryHelper::get_QueryKeywordLocale/
ISearchQueryHelper::put_QueryKeywordLocale
AQS(고급 쿼리 구문) 키워드를 구문 분석할 때 사용할 언어의 LCID를 가져오거나 넣습니다. 기본값은 기본 사용자 로캘입니다.

 

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

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

속성 및 열 작업

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

 

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

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

쿼리 용어 확장 작업

방법 설명
ISearchQueryHelper::get_QueryTermExpansion
ISearchQueryHelper::put_QueryTermExpansion
검색 용어 확장 플래그를 가져오거나 설정합니다.

 

이 메서드를 사용하면 정규식 확장과 유사하게 와일드카드 문자를 사용하여 일부 쿼리 용어를 확장할 수 있습니다. 접두사 확장은 'fun'/'funnel'과 같이 접두사가 같은 단어를 검색합니다. 설정하지 않으면 기본값이 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::put_QueryMaxResults
쿼리에서 반환할 최대 결과 수(즉, SELECT TOP n)를 가져오거나 설정합니다. 기본값은 -1입니다. 즉, 최대 결과 절이 생성되지 않습니다.
ISearchQueryHelper::get_QuerySorting
ISearchQueryHelper::put_QuerySorting
쿼리 결과 집합(ORDER BY)의 정렬 순서를 가져오거나 설정합니다. ORDER BY 절이 없으면 결과가 비결정적 순서로 반환됩니다.
ISearchQueryHelper::get_QuerySyntax
ISearchQueryHelper::put_QuerySyntax
쿼리 구문(고급 쿼리 구문 또는 자연 쿼리 구문)을 가져오거나 설정합니다.
ISearchQueryHelper::get_QueryWhereRestrictions
ISearchQueryHelper::put_QueryWhereRestrictions
WHERE 절을 통해 추가된 제한을 가져오거나 설정합니다.

 

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

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

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

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

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