Memahami pengendali filter di Windows Search

Pengendali filter, yang merupakan implementasi antarmuka IFilter, memindai dokumen untuk properti dan teks. Penangan filter mengekstrak potongan teks dari item-item ini, menyaring format yang disematkan dan menyimpan informasi tentang posisi dari teks. Mereka juga mengekstrak potongan nilai, yang merupakan properti dokumen. IFilter adalah fondasi untuk membangun aplikasi tingkat lebih tinggi seperti pengindeks dokumen dan pemirsa independen aplikasi.

Topik ini diatur sebagai berikut:

Tentang antarmuka IFilter

Microsoft Windows Search menggunakan filter untuk mengekstrak konten item untuk dimasukkan dalam indeks teks lengkap. Anda dapat memperluas Windows Search untuk mengindeks jenis file baru atau jenis file berpemilik dengan menulis filter untuk mengekstrak konten, dan penangan properti untuk mengekstrak properti file.

Antarmuka IFilter dirancang untuk memenuhi kebutuhan spesifik mesin pencari teks lengkap. Mesin pencari teks lengkap seperti Windows Search memanggil metode IFilter untuk mengekstrak informasi teks dan properti dan menambahkannya ke indeks. Windows Search memecah hasil metode IFilter::GetText yang dikembalikan menjadi kata-kata, menormalkannya, dan menyimpannya dalam indeks. Jika tersedia, mesin pencari menggunakan pengidentifikasi kode bahasa (LCID) dari potongan teks untuk melakukan pemecahan dan normalisasi kata khusus bahasa.

Windows Search menggunakan tiga fungsi, yang dijelaskan dalam tabel berikut, untuk mengakses penangan filter terdaftar (implementasi antarmuka IFilter). Fungsi-fungsi ini sangat berguna ketika memuat dan menghubungkan handler filter untuk objek yang disematkan.

Fungsi Deskripsi
LoadIFilter Mendapatkan penunjuk ke IFilter yang paling cocok untuk jenis konten yang ditentukan.
BindIFilterFromStorage Mendapatkan penunjuk ke IFilter yang paling cocok untuk konten yang terkandung dalam objek antarmuka IStorage .
BindIFilterFromStream Mendapatkan penunjuk ke IFilter yang paling cocok untuk Class Identifier (CLSID) tertentu yang diambil dari variabel stream.

AntarmukaIFiltermemiliki lima metode, yang dijelaskan dalam tabel berikut.

Metode Deskripsi
IFilter::Init Menginisialisasi sesi pemfilteran.
IFilter::GetChunk Menempatkan IFilter di awal gugus pertama atau berikutnya dan mengembalikan deskriptor.
IFilter::GetText Mengambil teks dari potongan saat ini.
IFilter::GetValue Mengambil nilai dari potongan saat ini.
IFilter::BindRegion Mengambil antarmuka yang mewakili bagian objek yang ditentukan. Dicadangkan untuk digunakan di masa mendatang.

Proses isolasi

Windows Search menjalankan IFilter dalam konteks keamanan Sistem Lokal dengan hak terbatas. Dalam proses isolasi host IFilter ini, sejumlah hak dihapus:

  • Kode Terbatas
  • Semua orang
  • Lokal
  • Interaktif
  • Pengguna Terautentikasi
  • Pengguna Bawaan
  • Pengidentifikasi keamanan pengguna (SID)

Penghapusan hak-hak ini berarti antarmukaIFilter tidak memiliki akses ke sistem disk atau jaringan atau ke antarmuka pengguna atau fungsi clipboard apa pun. Selain itu, proses isolasi berjalan di bawah objek tugas yang mencegah proses turunan dibuat dan memberlakukan batas 100 MB pada memori kerja. proses isolasi host antarmuka IFilter meningkatkan stabilitas platform pengindeksan, karena kemungkinan filter pihak ketiga yang salah diterapkan.

Nota

Pengendali filter harus dirancang untuk mengelola buffer dan menumpuk dengan benar. Semua salinan string harus memiliki pemeriksaan eksplisit untuk melindungi dari buffer overruns. Anda harus selalu memverifikasi ukuran buffer yang dialokasikan. Anda harus selalu menguji ukuran data terhadap ukuran buffer.

IFilter dlls

IFilter DLL mengimplementasikan antarmuka IFilter untuk memungkinkan klien mengekstrak informasi teks dan nilai properti dari tipe file, kelas, atau tipe yang dirasakan. Proses pemfilteran Windows Search SearchFilterHost.exe mengaitkan IFilter yang terdaftar untuk kelas, jenis yang dirasakan, atau ekstensi nama dari item.

Struktur IFilter

Setiap IFilter adalah file DLL yang mengimplementasikan server Model Objek Komponen (COM) dalam proses untuk menyediakan kemampuan pemfilteran yang ditentukan. Gambar berikut mengilustrasikan menunjukkan struktur keseluruhan IFilter DLL yang khas. Contoh yang lebih kompleks dapat menerapkan lebih dari satu kelas IFilter.

diagram struktur ifilter DLL yang umum

Kode asli

Filter harus ditulis dalam kode asli karena potensi masalah versi Common Language Runtime (CLR) dalam proses yang digunakan oleh beberapa add-in. Di Windows 7 dan yang lebih baru, filter yang ditulis dalam kode terkelola secara eksplisit diblokir.

Menemukan pengidentifikasi kelas IFilter

Kelas IFilter DLL terdaftar di bawah kunci registri PersistentHandler. Contoh berikut, untuk file HTML, menggambarkan cara menemukan IFilter DLL untuk dokumen HTML. Contoh ini mengikuti logika yang mirip dengan yang digunakan oleh sistem untuk menemukan IFilter terkait dengan item.

  1. Periksa apakah ekstensi untuk jenis file yang difilter DLL memiliki PersistentHandler yang terdaftar di bawah entri registri \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Biarkan kunci ini menjadi Value1. Jika entri tersebut sudah ada, lewati ke langkah 4 prosedur ini dan gunakan Value1 di kunci tersebut. Nilainya berjenis REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Atau, jika tidak ada PersistentHandler yang terdaftar untuk ekstensi, temukan CLSID yang terkait dengan jenis dokumen di bawah entri registri \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Biarkan kunci ini menjadi Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Tentukan apakah PersistentHandler terdaftar untuk CLSID. Dengan menggunakan Value2 yang ditentukan di langkah 2, temukan PersistentHandler untuk entri \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Biarkan kunci ini menjadi Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Tentukan GUID pengelola persisten IFilter. Menggunakan Value1 dan Value3, temukan GUID IFilter Persistent Handler untuk jenis dokumen. Nilai di bawah entri registri \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 atau 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> menghasilkan IFilter PersistentHandler GUID untuk jenis dokumen ini. Biarkan kunci ini menjadi Value4. Dalam contoh ini, GUID antarmuka IFilter adalah 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}

Nota

Dalam contoh ini, IFilter DLL untuk dokumen HTML adalah nlhtml.dll.

IFilter::GetChunk dan pengidentifikasi kode lokal

LCID teks dapat berubah dalam satu file. Misalnya, teks manual instruksi mungkin bergantian antara bahasa Inggris (en-us) dan Spanyol (es) atau teks dapat menyertakan satu kata dalam bahasa selain bahasa utama. Dalam kedua hal ini, IFilter Anda harus memulai bagian baru setiap kali LCID berubah. Karena LCID digunakan untuk memilih pemecah kata yang sesuai, sangat penting bagi Anda untuk mengidentifikasinya dengan benar. Jika IFilter tidak dapat menentukan lokalisasi teks, maka harus mengembalikan LCID dengan nilai nol dengan potongan. Mengembalikan LCID nol menyebabkan Windows Search menggunakan teknologi Deteksi Otomatis Bahasa (LAD) untuk menentukan ID lokal gugus. Jika Windows Search tidak dapat menemukan kecocokan, akan kembali ke local default sistem (dengan memanggil fungsi GetSystemDefaultLocaleName Function). Untuk informasi selengkapnya, lihat IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE, dan STAT_CHUNK.

Jika Anda mengontrol format file dan saat ini tidak berisi informasi lokal, Anda harus menambahkan fitur pengguna untuk mengaktifkan identifikasi lokal yang tepat. Menggunakan pemecah kata yang tidak cocok dapat mengakibatkan pengalaman kueri yang buruk bagi pengguna. Untuk informasi selengkapnya, lihat IWordBreaker.

Nota

Filter dikaitkan dengan jenis file, seperti yang ditunjukkan oleh ekstensi nama file, jenis MIME, atau CLSID. Meskipun satu filter dapat menangani beberapa jenis file, setiap jenis hanya berfungsi dengan satu filter.

Sumber daya tambahan

Pengembangan Pengelola Filter

Praktik Terbaik untuk Membuat Handler Filter di Windows Search

Mengembalikan Properti dari Handler Filter

Pengelola Filter yang Dikirim Bersama Windows

Menerapkan Handler Filter di Windows Search

Mendaftarkan Handler Filter

Handler Filter Pengujian