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
- Menemukan Pengidentifikasi Kelas IFilter
- Sumber Daya Tambahan
- Topik terkait
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 .
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.
- 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 gunakanValue1
dalam kunci tersebut. Nilainya berjenis REG_SZ.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- 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}
- 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 menjadiValue3
.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Tentukan GUID handler persisten IFilter . Menggunakan
Value1
danValue3
, 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 menjadiValue4
. 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
- Sampel kode IFilterSample , tersedia di GitHub, menunjukkan cara membuat kelas dasar IFilter untuk mengimplementasikan antarmuka IFilter .
- Untuk gambaran umum proses pengindeksan, lihat Proses Pengindeksan.
- Untuk gambaran umum jenis file, lihat Jenis File.
- Untuk mengkueri atribut asosiasi file untuk jenis file, lihat PerceivedTypes, SystemFileAssociations, dan Pendaftaran Aplikasi.
Topik terkait
Praktik Terbaik untuk Membuat Penangan Filter di Windows Search
Mengembalikan Properti dari Penangan Filter
Filter Handler yang Dikirim dengan Windows