Windows Search의 필터 처리기 이해

IFilter 인터페이스의 구현인 필터 처리기는 문서에서 텍스트 및 속성을 검사합니다. 필터 처리기는 이러한 항목에서 텍스트 청크를 추출하여 포함된 서식을 필터링하고 텍스트 위치에 대한 정보를 유지합니다. 또한 문서 속성인 값 청크를 추출합니다. IFilter 는 문서 인덱서 및 애플리케이션 독립적 뷰어와 같은 상위 수준 애플리케이션을 빌드하기 위한 기반입니다.

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

IFilter 인터페이스 정보

Microsoft Windows Search는 필터를 사용하여 전체 텍스트 인덱스에 포함할 항목의 콘텐츠를 추출합니다. 콘텐츠를 추출하는 필터를 작성하여 새 파일 또는 독점 파일 형식을 인덱싱하도록 Windows Search를 확장하고 속성 처리기를 확장하여 파일의 속성을 추출할 수 있습니다.

IFilter 인터페이스는 전체 텍스트 검색 엔진의 특정 요구 사항을 충족하도록 설계되었습니다. Windows Search와 같은 전체 텍스트 검색 엔진은 IFilter 메서드를 호출하여 텍스트 및 속성 정보를 추출하고 인덱스에 추가합니다. Windows Search는 반환된 IFilter::GetText 메서드의 결과를 단어로 구분하고, 정규화하고, 인덱스에 저장합니다. 사용 가능한 경우 검색 엔진은 텍스트 청크의 LCID(언어 코드 식별자)를 사용하여 언어별 단어 분리 및 정규화를 수행합니다.

Windows Search는 다음 표에 설명된 세 가지 함수를 사용하여 등록된 필터 처리기( IFilter 인터페이스 구현)에 액세스합니다. 이러한 함수는 포함된 개체의 필터 처리기를 로드하고 바인딩할 때 특히 유용합니다.

함수 Description
LoadIFilter 지정된 콘텐츠 형식에 가장 적합한 IFilter 에 대한 포인터를 가져옵니다.
BindIFilterFromStorage IStorage Interface 개체에 포함된 콘텐츠에 가장 적합한 IFilter에 대한 포인터를 가져옵니다.
BindIFilterFromStream 스트림 변수에서 검색된 CLSID(지정된 클래스 식별자)에 가장 적합한 IFilter 에 대한 포인터를 가져옵니다.

IFilter 인터페이스에는 다음 표에 설명된 5개의 메서드가 있습니다.

메서드 Description
IFilter::Init 필터링 세션을 초기화합니다.
IFilter::GetChunk 첫 번째 또는 다음 청크의 시작 부분에 IFilter 를 배치하고 설명자를 반환합니다.
IFilter::GetText 현재 청크에서 텍스트를 검색합니다.
IFilter::GetValue 현재 청크에서 값을 검색합니다.
IFilter::BindRegion 개체의 지정된 부분을 나타내는 인터페이스를 검색합니다. 다음에 사용하도록 예약됩니다.

격리 프로세스

Windows Search는 제한된 권한으로 로컬 시스템 보안 컨텍스트에서 IFilter를 실행합니다. 이 IFilter 호스트 격리 프로세스에서는 다음과 같은 여러 권한이 제거됩니다.

  • 제한된 코드
  • 모든 사람
  • 로컬
  • 대화형
  • 인증된 사용자
  • 기본 제공 사용자
  • 사용자 SID(보안 식별자)

이러한 권한이 제거되면 IFilter 인터페이스가 디스크 시스템이나 네트워크 또는 사용자 인터페이스 또는 클립보드 함수에 액세스할 수 없습니다. 또한 격리 프로세스는 자식 프로세스가 만들어지는 것을 방지하고 작업 집합에 100MB 제한을 적용하는 작업 개체에서 실행됩니다. IFilter 인터페이스 호스트 격리 프로세스는 타사 필터가 잘못 구현될 수 있으므로 인덱싱 플랫폼의 안정성을 높입니다.

참고

버퍼를 관리하고 올바르게 스택하려면 필터 처리기를 작성해야 합니다. 모든 문자열 복사본에는 버퍼 오버런을 막기 위한 명시적 검사가 있어야 합니다. 항상 버퍼의 할당된 크기를 확인해야 합니다. 항상 버퍼 크기에 대해 데이터 크기를 테스트해야 합니다.

IFilter DLL

IFilter DLL은 IFilter 인터페이스를 구현하여 클라이언트가 파일 형식, 클래스 또는 인식된 형식에서 텍스트 및 속성 값 정보를 추출할 수 있도록 합니다. Windows Search 필터링 프로세스 는SearchFilterHost.exe 항목의 클래스, 인식된 형식 또는 이름 확장에 등록된 IFilter 에 바인딩됩니다.

IFilter 구조체

IFilter 는 지정된 필터링 기능을 제공하기 위해 IN-Process COM(구성 요소 개체 모델) 서버를 구현하는 DLL 파일입니다. 다음 그림에서는 일반적인 IFilter DLL의 전체 구조를 보여 줍니다. 더 복잡한 예제는 둘 이상의 IFilter 클래스를 구현할 수 있습니다.

일반적인 ifilter dll의 구조 다이어그램

네이티브 코드

여러 추가 기능이 실행되는 프로세스의 잠재적인 CLR(공용 언어 런타임) 버전 관리 문제로 인해 필터를 네이티브 코드로 작성해야 합니다. Windows 7 이상에서는 관리 코드로 작성된 필터가 명시적으로 차단됩니다.

IFilter 클래스 식별자 찾기

IFilter DLL의 클래스는 PersistentHandler 레지스트리 키 아래에 등록됩니다. 다음 예제에서는 HTML 파일의 경우 HTML 문서에 대한 IFilter DLL을 찾는 방법을 보여 줍니다. 이 예제에서는 시스템에서 항목과 연결된 IFilter 를 찾는 데 사용하는 것과 유사한 논리를 따릅니다.

  1. DLL 필터에 레지스트리 항목 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes 아래에 등록된 PersistentHandler가 있는 파일 형식의 확장명인지 확인합니다. 이 키가 되도록 합니다 Value1. 해당 항목이 이미 있는 경우 이 절차의 4단계로 건너뛰고 해당 키에서 를 사용합니다 Value1 . 값은 REG_SZ 형식입니다.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. 또는 확장에 대해 등록된 PersistentHandler가 없는 경우 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes 레지스트리 항목에서 문서 형식과 연결된 CLSID를 찾습니다. 이 키가 되도록 합니다 Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. PersistentHandler가 CLSID에 등록되어 있는지 여부를 확인합니다. 2단계에서 결정된 를 사용하여 Value2 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2 항목에 대한 PersistentHandler를 찾습니다. 이 키가 되도록 합니다 Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. IFilter 영구 처리기 GUID를 확인합니다. 및 를 Value3사용하여 Value1 문서 형식에 대한 IFilter 영구 처리기 GUID를 찾습니다. 레지스트리 항목 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 또는 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> 아래 값은 이 문서 형식에 대한 IFilter PersistentHandler GUID를 생성합니다. 이 키가 되도록 합니다 Value4. 이 예제에서 IFilter 인터페이스 GUID는 89BCB740-6119-101A-BCB7-00DD010655AF입니다.
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             {EEC97550-47A9-11CF-B952-00AA0051FE20}
                 = HTML File Persistent Handler
                    Data type         REG_SZ
                        PersistentAddinsRegistered
                        {89BCB740-6119-101A-BCB7-00DD010655AF}

                    Data type         REG_SZ
                        default = {E0CA5340-4534-11CF-B952-00AA0051FE20}

참고

이 예제에서는 HTML 문서에 대한 IFilter DLL이 nlhtml.dll.

IFilter::GetChunk 및 로캘 코드 식별자

텍스트의 LCID는 단일 파일 내에서 변경할 수 있습니다. 예를 들어 명령 설명서의 텍스트는 영어(en-us)와 스페인어(es)를 번갈아 사용할 수도 있고, 텍스트에는 기본 언어가 아닌 다른 언어로 한 단어가 포함될 수 있습니다. 두 경우 모두 IFilter 는 LCID가 변경 될 때마다 새 청크를 시작해야 합니다. LCID는 적절한 단어 분리기를 선택하는 데 사용되므로 올바르게 식별하는 것이 매우 중요합니다. IFilter가 텍스트의 로캘을 확인할 수 없는 경우 청크가 있는 LCID 0을 반환해야 합니다. LCID가 0이면 Windows Search에서 LAD(언어 자동 검색) 기술을 사용하여 청크의 로캘 ID를 결정합니다. Windows Search에서 일치하는 항목을 찾을 수 없는 경우 GetSystemDefaultLocaleName 함수 함수를 호출하여 기본적으로 시스템 기본 로캘로 설정됩니다. 자세한 내용은 IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATESTAT_CHUNK 참조하세요.

파일 형식을 제어하고 현재 로캘 정보를 포함하지 않는 경우 사용자 기능을 추가하여 적절한 로캘 식별을 사용하도록 설정해야 합니다. 일치하지 않는 단어 분리기를 사용하면 사용자에게 쿼리 환경이 저하될 수 있습니다. 자세한 내용은 IWordBreaker를 참조하세요.

참고

필터는 파일 이름 확장명, MIME 형식 또는 CLSID로 표시된 대로 파일 형식과 연결됩니다. 하나의 필터가 여러 파일 형식을 처리할 수 있지만 각 형식은 하나의 필터에서만 작동합니다.

추가 리소스

필터 처리기 개발

Windows Search에서 필터 처리기를 만들기 위한 모범 사례

필터 처리기에서 속성 반환

Windows와 함께 제공되는 필터 처리기

Windows Search에서 필터 처리기 구현

필터 처리기 등록

필터 처리기 테스트