Bagikan melalui


Memahami Penangan Filter di Windows Search

Penangan filter, yang merupakan implementasi antarmuka IFilter , memindai dokumen untuk teks dan properti. Penangan filter mengekstrak potongan teks dari item ini, memfilter pemformatan yang disematkan dan menyimpan informasi tentang posisi teks. Mereka juga mengekstrak potongan nilai, yang merupakan properti dokumen. IFilter adalah fondasi untuk membangun aplikasi tingkat yang 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 kepemilikan 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 teks dan informasi 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 gugus teks untuk melakukan pemecahan dan normalisasi kata khusus bahasa.

Windows Search menggunakan tiga fungsi, yang dijelaskan dalam tabel berikut, untuk mengakses handler filter terdaftar (implementasi antarmuka IFilter ). Fungsi-fungsi ini sangat berguna saat memuat dan mengikat ke penangan filter 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 pointer ke IFilter yang paling cocok untuk pengidentifikasi kelas tertentu (CLSID) yang diambil dari variabel stream.

Antarmuka IFilter memiliki lima metode, dijelaskan dalam tabel berikut.

Metode Deskripsi
IFilter::Init Menginisialisasi sesi pemfilteran.
IFilter::GetChunk Memposisikan IFilter di awal gugus pertama atau berikutnya dan mengembalikan deskriptor.
IFilter::GetText Mengambil teks dari gugus saat ini.
IFilter::GetValue Mengambil nilai dari gugus saat ini.
IFilter::BindRegion Mengambil antarmuka yang mewakili bagian objek yang ditentukan. Disiapkan untuk penggunaan 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 yang Diautentikasi
  • Pengguna Bawaan
  • Pengidentifikasi keamanan pengguna (SID)

Penghapusan hak-hak ini berarti antarmuka IFilter 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 pekerjaan yang mencegah proses anak dibuat dan memberlakukan batas 100 MB pada set kerja. proses isolasi host antarmuka IFilter meningkatkan stabilitas platform pengindeksan, karena kemungkinan filter pihak ketiga yang salah diterapkan.

Catatan

Penangan filter harus ditulis untuk mengelola buffer, dan tumpukan dengan benar. Semua salinan string harus memiliki pemeriksaan eksplisit untuk melindungi dari overrun buffer. Anda harus selalu memverifikasi ukuran buffer yang dialokasikan. Anda harus selalu menguji ukuran data terhadap ukuran buffer.

DLL IFilter

IFilter DLL mengimplementasikan antarmuka IFilter untuk memungkinkan klien mengekstrak informasi nilai teks dan properti dari jenis file, kelas, atau jenis yang dirasakan. Proses pemfilteran Windows Search SearchFilterHost.exe mengikat IFilter yang terdaftar untuk kelas, jenis yang dirasakan, atau ekstensi nama 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 DLL IFilter yang khas. Contoh yang lebih kompleks dapat mengimplementasikan lebih dari satu kelas IFilter .

diagram struktur dll ifilter yang khas

Kode Asli

Filter harus ditulis dalam kode asli karena potensi masalah penerapan versi common language runtime (CLR) dengan proses yang dijalankan beberapa add-in. Di Windows 7 dan yang lebih baru 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 yang 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 dari prosedur ini dan gunakan Value1 dalam 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 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 handler 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-00D010655AF"/> menghasilkan GUID IFilter PersistentHandler 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}

Catatan

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

IFilter::GetChunk dan Pengidentifikasi Kode Lokal

LCID teks dapat berubah dalam satu file. Misalnya, teks manual instruksi mungkin bergantian antara bahasa Inggris (id-id) dan Spanyol (es) atau teks dapat menyertakan satu kata dalam satu bahasa selain bahasa utama. Dalam kedua kasus, IFilter Anda harus memulai gugus 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 lokal teks, maka IFilter harus mengembalikan LCID nol dengan gugus. Mengembalikan LCID nol menyebabkan Windows Search menggunakan teknologi Deteksi Otomatis Bahasa (LAD) untuk menentukan ID lokal gugus. Jika Windows Search tidak dapat menemukan kecocokan, ini default ke lokal default sistem (dengan memanggil fungsi Fungsi GetSystemDefaultLocaleName ). 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.

Catatan

Filter dikaitkan dengan jenis file, seperti yang ditandai dengan 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

Mengembangkan Handler Filter

Praktik Terbaik untuk Membuat Penangan Filter di Windows Search

Mengembalikan Properti dari Penangan Filter

Filter Handler yang Dikirim dengan Windows

Menerapkan Handler Filter di Windows Search

Mendaftarkan Penangan Filter

Menguji Handler Filter