Udostępnij za pośrednictwem


Informacje o programach obsługi filtrów w usłudze Windows Search

Programy obsługi filtrów, które są implementacjami interfejsu IFilter, skanują dokumenty pod kątem tekstu i właściwości. Programy obsługi filtrów wyodrębniają fragmenty tekstu z tych elementów, filtrując osadzone formatowanie i zachowując informacje o położeniu tekstu. Wyodrębniają również fragmenty wartości, które są właściwościami dokumentu. IFilter jest podstawą do budowania aplikacji wyższego poziomu, takich jak indeksatory dokumentów i przeglądarki niezależne od aplikacji.

Ten temat jest zorganizowany w następujący sposób:

Informacje o interfejsie IFilter

Usługa Microsoft Windows Search używa filtrów do wyodrębniania zawartości elementów w celu włączenia ich do indeksu pełnotekstowego. Możesz rozszerzyć usługę Windows Search, aby indeksować nowe lub zastrzeżone typy plików, zapisując filtry w celu wyodrębnienia zawartości i procedur obsługi właściwości w celu wyodrębnienia właściwości plików.

Interfejs IFilter został zaprojektowany pod kątem konkretnych potrzeb aparatów wyszukiwania pełnotekstowego. Aparaty wyszukiwania pełnotekstowego, takie jak Windows Search, wywołają metody IFilter w celu wyodrębnienia informacji o tekście i właściwościach oraz dodania ich do indeksu. Usługa Windows Search dzieli wyniki uzyskane z metody IFilter::GetText na wyrazy, normalizuje je i zapisuje w indeksie. Jeśli jest dostępna, aparat wyszukiwania używa identyfikatora kodu języka (LCID) fragmentu tekstu w celu wykonania podziału i normalizacji wyrazów specyficznych dla języka.

Usługa Windows Search używa trzech funkcji opisanych w poniższej tabeli, aby uzyskać dostęp do zarejestrowanych procedur obsługi filtrów (implementacje interfejsu IFilter). Te funkcje są szczególnie przydatne podczas ładowania i wiązania z obsługą filtrów obiektu osadzonego.

Funkcja Opis
LoadIFilter Pobiera wskaźnik do IFilter, który jest najbardziej odpowiedni dla określonego typu zawartości.
BindIFilterFromStorage Pobiera wskaźnik do IFilter, który jest najbardziej odpowiedni dla zawartości zawartej w obiekcie IStorage Interface.
BindIFilterFromStream Pobiera wskaźnik do IFilter, który jest najbardziej odpowiedni dla określonego identyfikatora klasy (CLSID) pobranego ze zmiennej strumienia.

Interfejs IFilter zawiera pięć metod opisanych w poniższej tabeli.

Metoda Opis
IFilter::Init Inicjuje sesję filtrowania.
IFilter::GetChunk Umieszcza IFilter na początku pierwszego lub kolejnego fragmentu i zwraca deskryptor.
IFilter::GetText Pobiera tekst z bieżącego fragmentu.
IFilter::GetValue Pobiera wartości z bieżącego fragmentu.
IFilter::BindRegion Pobiera interfejs reprezentujący określoną część obiektu. Zarezerwowane na przyszłość.

Proces izolacji

Usługa Windows Search uruchamia filtry IFilters w kontekście zabezpieczeń systemu lokalnego z ograniczonymi prawami. W procesie izolacji hosta IFilter są usuwane następujące prawa:

  • Kod ograniczony
  • Każdy
  • Lokalny
  • Interaktywny
  • Uwierzytelnieni użytkownicy
  • Użytkownicy wbudowani
  • Identyfikator zabezpieczeń (SID) użytkowników

Usunięcie tych praw oznacza, że interfejs IFilter nie ma dostępu do systemu plików, sieci, interfejsu użytkownika czy funkcji schowka. Ponadto proces izolacyjny jest uruchamiany w ramach obiektu zadania systemowego, który uniemożliwia tworzenie procesów podrzędnych i nakłada limit 100 MB na pamięć roboczą. IFilter proces izolacji hosta interfejsu zwiększa stabilność platformy indeksowania ze względu na możliwość niepoprawnego zaimplementowania filtrów innych firm.

Notatka

Procedury obsługi filtrów muszą być napisane w celu prawidłowego zarządzania buforami i stosami. Wszystkie kopie ciągów muszą mieć jawne kontrole, aby chronić przed przekroczeniami buforu. Zawsze należy sprawdzić przydzielony rozmiar buforu. Zawsze należy przetestować rozmiar danych względem rozmiaru buforu.

Biblioteki DLL IFilter

IFilter DLL implementują interfejs IFilter, aby umożliwić klientowi wyodrębnianie informacji o wartości tekstu i właściwości z typu pliku, klasy lub typu postrzeganego. Proces filtrowania wyszukiwania w systemie Windows SearchFilterHost.exe wiąże się z IFilter zarejestrowanym dla klasy, postrzeganego typu lub rozszerzenia nazwy elementu.

IFilter — Struktura

Każdy IFilter to plik DLL, który implementuje serwer modelu obiektów składników procesu (COM) w celu zapewnienia określonych możliwości filtrowania. Na poniższej ilustracji przedstawiono ogólną strukturę typowych bibliotek DLL IFilter. Bardziej złożony przykład może implementować więcej niż jedną klasę IFilter.

diagram struktury typowej biblioteki DLL ifilter

Kod natywny

Filtry muszą być zapisywane w kodzie natywnym z powodu potencjalnych problemów z wersją środowiska uruchomieniowego języka wspólnego (CLR) w procesie, w ramach którego działa wiele dodatków. W systemie Windows 7 lub nowszym filtry napisane w kodzie zarządzanym są jawnie blokowane.

Znajdowanie identyfikatora klasy IFilter

Klasa IFilter DLL jest zarejestrowana w kluczu rejestru PersistentHandler. W poniższym przykładzie dla plików HTML pokazano, jak znaleźć bibliotekę DLL IFilter dla dokumentu HTML. W tym przykładzie stosowana jest logika podobna do używanej przez system w celu znalezienia IFilter skojarzonej z elementem.

  1. Sprawdź, czy rozszerzenie dla typu plików, które filtruje biblioteki DLL, ma program PersistentHandler zarejestrowany w wpisie rejestru \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Niech ten klucz będzie Value1. Jeśli ten wpis już istnieje, przejdź do kroku 4 tej procedury i użyj Value1 w tym kluczu. Wartości są typu REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Alternatywnie, jeśli dla rozszerzenia nie zarejestrowano programu PersistentHandler, znajdź identyfikator CLSID skojarzony z typem dokumentu w wpisie rejestru \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Niech ten klucz będzie Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Ustal, czy element PersistentHandler jest zarejestrowany dla identyfikatora CLSID. Korzystając z Value2 określonego w kroku 2, odnajdź PersistentHandler dla wpisu \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Niech ten klucz będzie Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Określ identyfikator GUID programu obsługi trwałej IFilter. Korzystając z Value1 i Value3, znajdź trwały identyfikator GUID programu obsługi IFilter dla typu dokumentu. Wartość pod wpisem rejestru \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 lub 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> zwraca identyfikator GUID PersistentHandler dla tego typu dokumentu jako IFilter. Niech ten klucz będzie Value4. W tym przykładzie identyfikator GUID interfejsu IFilter to 89BCB740-6119-101A-BCB7-00DDD010655AF.
    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}

Uwaga

W tym przykładzie biblioteka DLL IFilter dla dokumentów HTML jest nlhtml.dll.

IFilter::GetChunk i Identyfikatory kodu ustawień regionalnych

Identyfikator LCID tekstu może ulec zmianie w obrębie pojedynczego pliku. Na przykład tekst podręcznika obsługi może występować naprzemiennie w języku angielskim (en-us) i hiszpańskim (es) lub tekst może zawierać jedno słowo w języku innym niż język podstawowy. W obu przypadkach IFilter musi rozpoczynać nowy fragment za każdym razem, gdy zmienia się LCID. Ponieważ identyfikator LCID jest używany do wybierania odpowiedniego mechanizmu podziału wyrazów, bardzo ważne jest, aby prawidłowo go określić. Jeśli IFilter nie może określić ustawień regionalnych tekstu, powinien zwrócić identyfikator LCID o wartości zero wraz z fragmentem. Zwracanie identyfikatora LCID zera powoduje, że usługa Windows Search używa technologii automatycznego wykrywania języka (LAD) w celu określenia identyfikatora ustawień regionalnych fragmentu. Jeśli usługa Windows Search nie może odnaleźć dopasowania, ustawia na domyślne ustawienia regionalne systemu (wywołując funkcję GetSystemDefaultLocaleName). Aby uzyskać więcej informacji, zobacz IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATEi STAT_CHUNK.

Jeśli kontrolujesz format pliku i obecnie nie zawiera informacji o ustawieniach regionalnych, należy dodać funkcję użytkownika, aby umożliwić właściwą identyfikację ustawień regionalnych. Użycie niewłaściwego podziału wyrazów może spowodować słabe doświadczenie z zapytaniem dla użytkownika. Aby uzyskać więcej informacji, zobacz IWordBreaker.

Notatka

Filtry są skojarzone z typami plików, co oznacza rozszerzenia nazw plików, typy MIME lub identyfikatory CLSID. Chociaż jeden filtr może obsługiwać wiele typów plików, każdy typ działa tylko z jednym filtrem.

Dodatkowe zasoby

tworzenie programów obsługi filtrów

najlepsze rozwiązania dotyczące tworzenia programów obsługi filtrów w usłudze Windows Search

zwracanie właściwości z programu obsługi filtrów

Programy obsługi filtrów dostarczane z systemem Windows

Wdrażanie obsług filtrów w usłudze Windows Search

rejestrowanie programów obsługi filtrów

Obsługa filtrów testujących