Mengembangkan Add-in IFilter
Catatan
Windows Desktop Search 2.x adalah teknologi usang yang awalnya tersedia sebagai add-in untuk Windows XP dan Windows Server 2003. Pada rilis selanjutnya, gunakan Windows Search sebagai gantinya.
Anda dapat memperluas Microsoft Windows Desktop Search (WDS) dengan add-in filter, komponen yang mengimplementasikan antarmuka IFilter, untuk menyertakan jenis file baru. Filter bertanggung jawab untuk mengakses dan mengurai data dalam file dan untuk mengembalikan pasangan properti dan nilai serta potongan teks untuk pengindeksan. Selama proses pengindeksan, WDS memanggil filter yang sesuai dengan URL untuk setiap file atau item. Filter pertama-tama mengekstrak metadata yang sesuai dengan properti yang ditandai dapat diambil dalam skema WDS, seperti judul, ukuran file, dan tanggal terakhir diubah. Kemudian memecah konten item menjadi potongan teks. WDS menambahkan properti dan teks yang dikembalikan oleh filter ke katalog. WDS dapat mengindeks jenis file apa pun yang memiliki filter terdaftar.
Dalam beberapa keadaan, Anda tidak perlu menulis filter baru. WDS 2.x berisi filter untuk lebih dari 200 jenis item (termasuk item teks biasa seperti HTML, XML, dan file kode sumber) dan menggunakan teknologi IFilteryang sama dengan SharePoint Services. Jika Anda sudah memiliki filter yang terinstal untuk jenis file Anda, WDS dapat menggunakan filter yang ada untuk mengindeks data ini. Selain itu, WDS menyertakan filter umum untuk jenis file yang berbasis teks biasa. Jika Anda memiliki tipe file yang bisa diproses dengan filter Layanan SharePoint yang sudah ada atau filter teks biasa, Anda bisa menambahkan ekstensi nama file dan memfilter GUID ke Registri sehingga WDS dapat menemukan dan menggunakannya (lihat Mendaftarkan Add-in Filter untuk informasi selengkapnya).
Namun, jika Anda memiliki data atau format file non-plaintext dan kepemilikan, menulis implementasi filter kustom adalah satu-satunya cara untuk memastikan WDS dapat mengindeks format file dalam katalog. Anda hanya dapat memiliki satu add-in filter untuk jenis file, sehingga dimungkinkan untuk menimpa filter yang ada atau agar filter lain menimpa filter Anda untuk jenis file tertentu.
Bagian ini berisi topik berikut:
- Antarmuka Filter yang Diperlukan
- Properti Output dengan Filter
- Penginstalan Add-in Filter
- Topik terkait
Antarmuka Filter yang Diperlukan
Add-in filter harus mengimplementasikan antarmuka IFilterdan salah satu antarmuka berikut:
- IPersistStream - Untuk memuat data dari aliran. Ini lebih aman daripada menggunakan file karena tidak ada yang ditulis ke disk. Antarmuka IPersistStream adalah metode yang disukai untuk meneruskan kompatibilitas dengan Windows Vista.
- Antarmuka IPersistFile - Untuk memuat data dari file. Antarmuka ini tidak didukung di Windows Vista.
- Antarmuka IPersistStorage - Untuk memuat data dari Penyimpanan Terstruktur OLE COM.
Add-in filter menggunakan antarmuka ini untuk mendapatkan konten item dan mengembalikannya secara berulang ke indeks hingga akhir file tercapai. Add-in filter harus sekuat mungkin untuk menangani file yang rusak dan yang tidak memenuhi format input yang diharapkan.
Antarmuka IFilter
Ini adalah antarmuka yang diperlukan untuk implementasi filter. Untuk informasi selengkapnya, lihat referensi antarmuka IFilter.
Metode | Deskripsi |
---|---|
Init() | Menginisialisasi sesi pemfilteran. |
GetChunk() | Memposisikan filter di awal gugus pertama atau berikutnya dan mengembalikan deskriptor. |
GetText() | Mengambil teks dari gugus saat ini. |
GetValue() | Mengambil nilai properti dari gugus saat ini. |
BindRegion() | Saat ini dicadangkan untuk penggunaan internal; tidak mengimplementasikan. Metode ini mengembalikan E_NOTIMPL. |
IPersistStream
Antarmuka ini memuat file dari aliran untuk pemrosesan yang lebih aman daripada Antarmuka IPersistFile karena konteks di mana filter IPersistStream berjalan tidak memerlukan hak untuk membuka file apa pun pada disk atau melalui jaringan. Dari dua metode untuk mengakses satu file, ini adalah metode yang disukai untuk meneruskan kompatibilitas dengan Windows.
Metode | Deskripsi |
---|---|
IsDirty() | Memeriksa apakah ada perubahan. Metode ini mengembalikan E_NOTIMPL dalam filter. |
InitNew() | Membuat penyimpanan baru. Metode ini mengembalikan E_NOTIMPL dalam filter. |
Load() | Menginisialisasi objek dari aliran tempat objek sebelumnya disimpan. |
Simpan() | Menyimpan objek ke aliran yang ditentukan dan menunjukkan apakah objek harus mengatur ulang bendera kotornya. Metode ini mengembalikan E_NOTIMPL dalam filter. |
GetSizeMax() | Mengembalikan ukuran dalam byte aliran yang diperlukan untuk menyimpan objek. Metode ini mengembalikan E_NOTIMPL dalam filter. |
IPersistFile
Antarmuka ini memuat file menurut jalur absolut dan tidak didukung di Windows Vista.
Metode | Deskripsi |
---|---|
GetCurFile() | Mendapatkan nama file saat ini yang terkait dengan objek . Mengembalikan jalur yang ditentukan dalam Load(). |
Load() | Membuka file yang ditentukan dan menginisialisasi objek dari isi file. Anda dapat menunda membuka file hingga Anda membutuhkannya. |
GetClassID() | Mengembalikan pengidentifikasi kelas (CLSID) untuk jenis file baru. Anda harus menggunakan uuidgen.exe untuk menghasilkan CLSID yang unik. |
IsDirty() | Hanya perlu mengembalikan E_NOTIMPL dalam filter |
Simpan() | Hanya perlu mengembalikan E_NOTIMPL dalam filter |
SaveCompleted() | Hanya perlu mengembalikan E_NOTIMPL dalam filter |
IPersistStorage
Antarmuka ini mendukung model penyimpanan terstruktur, di mana masing-masing objek yang terkandung memiliki penyimpanan sendiri yang berlapis dalam penyimpanan kontainer. Seperti Antarmuka IPersistFile, antarmuka ini dimuat berdasarkan jalur absolut dan tidak didukung di Windows Vista.
Metode | Deskripsi |
---|---|
IsDirty() | Memeriksa apakah ada perubahan. Metode ini mengembalikan E_NOTIMPL dalam filter. |
InitNew() | Membuat penyimpanan baru. Metode ini mengembalikan E_NOTIMPL dalam filter. |
Load() | Menyimpan penyimpanan. Metode ini mengembalikan E_NOTIMPL dalam filter. |
Simpan() | Mengembalikan ukuran dalam byte aliran yang diperlukan untuk menyimpan objek. Metode ini mengembalikan E_NOTIMPL dalam filter. |
SaveCompleted() | Dicadangkan untuk penggunaan internal. Metode ini mengembalikan E_NOTIMPL dalam filter. |
HandsoffStorage() | Dicadangkan untuk penggunaan internal. Metode ini mengembalikan E_NOTIMPL dalam filter. |
Properti Output dengan Filter
Tujuan filter adalah untuk mengekstrak konten dan properti file untuk dimasukkan dalam indeks teks lengkap. WDS pertama-tama memanggil metode Load pada implementasi IPersistFile, IPersistStream, atau IPersistStorage dan kemudian memanggil metode Init dari implementasi IFilter. GetChunk dipanggil untuk mengambil potongan teks atau data nilai properti, lalu GetText atau GetValue dipanggil sebanyak yang diperlukan untuk mengambil semua nilai teks atau properti yang terkait dengan potongan. Proses ini berulang sampai GetChunk melaporkan bahwa tidak ada lagi gugus dalam dokumen.
Metode GetChunk mengambil informasi tentang blok logis informasi pertama atau berikutnya dari file yang difilter dan mengembalikan informasi tersebut dalam struktur STAT_CHUNK, termasuk ID gugus yang meningkat secara monoton, informasi status tentang bagaimana potongan saat ini berkaitan dengan gugus sebelumnya, bendera yang menunjukkan apakah gugus berisi teks atau nilai, lokal gugus, dan spesifikasi properti gugus. Spesifikasi properti adalah FULLPROPSPEC yang terdiri dari CLSID dan pengidentifikasi properti bilangan bulat atau string (misalnya, D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType). Ini mengidentifikasi jenis properti daripada nilai properti itu sendiri.
Pengidentifikasi lokal gugus digunakan untuk memilih pemecah kata yang sesuai, dan sangat penting bagi Anda untuk mengidentifikasinya dengan benar. Jika filter tidak dapat menentukan lokal teks, filter harus mengasumsikan lokal sistem default, tersedia dengan menggunakan GetSystemDefaultLCID. 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 menyebabkan pengalaman kueri yang buruk bagi pengguna.
GetChunk hanya mengelola mengakses gugus dan tidak mengembalikan nilai teks atau properti itu sendiri. Sebaliknya, panggilan berikutnya ke GetText dan GetValue mengambil isi gugus. GetText mengembalikan potongan teks, yang merupakan string Unicode, dari potongan CHUNK_TEXT saat ini. Jika potongan saat ini terlalu besar, lebih dari satu panggilan ke metode GetText dapat diperlukan. Setiap panggilan ke metode GetText mengambil teks yang segera mengikuti teks dari panggilan terakhir ke metode GetText . Misalnya, karakter terakhir dari satu panggilan dapat berada di tengah kata, dan karakter pertama dalam panggilan berikutnya akan melanjutkan kata itu. Mesin pencari harus menangani situasi ini.
GetValue mengembalikan nilai properti untuk potongan CHUNK_VALUE saat ini dalam struktur PROPVARIANT, yang dapat menyimpan berbagai jenis data. GetValue harus mengalokasikan struktur PROPVARIANT itu sendiri menggunakan CoTaskMemAlloc. Pemanggil GetValue bertanggung jawab untuk membebaskan memori yang diarahkan oleh PROPVARIANT menggunakan PropVariantClear, dan untuk membebaskan struktur itu sendiri dengan CoTaskMemFree. Untuk informasi selengkapnya tentang PROPVARIANTs, lihat referensi PROPVARIANT .
Nilai Properti
Filter harus menghasilkan minimal properti berikut yang merupakan kolom default dalam tampilan hasil WDS.
GUID | PROPSPEC | Nama yang Mudah Diingat | Deskripsi |
---|---|---|---|
F29F85E0-4FF9-1068-AB91-08002B27B3D9 | 2 | PrimaryTitle | Judul yang ditampilkan untuk item ini. |
F29F85E0-4FF9-1068-AB91-08002B27B3D9 | 4 | PrimaryAuthors | Orang yang paling terkait dengan item ini. |
D5CDD505-2E9C-101B-9397-08002B2CF9AE | PrimaryDate | PrimaryDate | Tanggal terpenting untuk item, seperti tanggal diterima untuk email atau dimodifikasi untuk file. |
D5CDD505-2E9C-101B-9397-08002B2CF9AE | PerceivedType | PerceivedType | Jenis file yang sedang diurai. Harus cocok dengan salah satu tipe Pencarian Desktop Windows yang tercantum dalam WDS Perceived Type. |
Untuk item teks biasa, WDS mengekstrak semua teks dan properti yang ditentukan sistem seperti ukuran file atau ekstensi pada termasuk jenis file teks biasa baru ke indeks). Jenis properti lain yang dapat dikembalikan ke indeks meliputi:
- Untuk file: penulis, judul, status, kata kunci
- Untuk media: album, genre, pembuatan kamera, tanggal diambil
- Untuk komunikasi: dari, hingga, cc, kepentingan
- Untuk kontak: jabatan, telepon bisnis, perusahaan
Daftar di atas mengelompokkan properti yang umum untuk Jenis Perceived tertentu; namun, properti apa pun dapat digunakan terlepas dari jenisnya. Misalnya, perusahaan dapat digunakan untuk nama perusahaan kontak dan juga dapat digunakan untuk merujuk ke nama klien yang terkait dengan file. Banyak dari properti ini digunakan untuk menampilkan hasil pencarian dalam tampilan hasil WDS. Misalnya, properti Judul file ditampilkan sebagai kolom utama dalam tampilan hasil default. Objek IFilter harus menghasilkan semua properti yang terkait dengan jenis item yang mereka uraikan. Properti kustom tidak dapat ditambahkan dalam WDS 2.x. Untuk daftar lengkap properti yang tersedia, lihat Skema WDS.
Penginstalan Add-in Filter
Menginstal filter melibatkan penyalinan DLL ke lokasi yang sesuai di direktori Program Files dan mendaftarkannya. Filter harus menerapkan pendaftaran mandiri untuk penginstalan dan harus mengikuti panduan berikut:
- Alat penginstal harus menggunakan alat penginstal EXE atau MSI.
- Catatan rilis harus disediakan.
- Entri Tambah/Hapus Program harus dibuat untuk setiap add-in yang terinstal.
- Alat penginstal harus mengambil alih semua pengaturan registri untuk jenis file tertentu atau menyimpan yang dipahami add-in saat ini.
- Jika add-in sebelumnya sedang ditimpa, alat penginstal harus memberi tahu pengguna.
- Jika add-in yang lebih baru telah menimpa add-in sebelumnya, seharusnya ada kemampuan untuk memulihkan fungsionalitas add-in sebelumnya dan menjadikannya add-in default untuk jenis file atau penyimpanan tersebut lagi.
CLSID Diperlukan untuk Pendaftaran
Ada tiga pengidentifikasi kelas, atau CLSID, yang terkait dengan setiap filter. Anda harus membuat satu atau beberapa (gunakan uuidgen.exe) untuk mendaftarkan add-in filter Anda.
- Yang pertama mengidentifikasi semua handler persisten filter, IID_IFilter, yaitu {89BCB740-6119-101A-BCB7-00DD010655AF}. CLSID ini konstan untuk semua filter yang mengimplementasikan IFilter.
- Yang kedua (nilai kunci IID_IFilter) mengidentifikasi implementasi IFilter untuk jenis file Anda. Kunci ini berisi nilai InprocServer32 yang menentukan nama DLL menurut jalur dan model utas. Jika filter berada di jalur sistem, seperti direktori system32, nama file sudah cukup. Jika tidak, nilai ini harus memiliki spesifikasi jalur lengkap.
- Yang ketiga mengidentifikasi jenis file proses filter dan dikembalikan oleh metode GetClassID pada antarmuka IPersist Anda.
Catatan
Dalam versi sistem operasi Microsoft di masa mendatang, menginstal file di direktori system32 mungkin menjadi lebih sulit, jadi kami sarankan Anda menginstalnya di bawah Program Files dan menyertakan jalur lengkap ke filter di registri. Untuk alasan keamanan, juga bijaksana untuk menentukan jalur lengkap ke DLL Anda di registri. Jika tidak, versi "Trojan horse" DLL Anda dapat dimuat jika kebetulan berada di jalur proses sebelum versi Anda.
Model Pendaftaran
Ketika WDS siap untuk memfilter file, WDS akan melihat registri di bawah ekstensi file untuk menentukan filter mana yang akan dimuat. Kemudian mengikuti serangkaian tautan registri untuk menemukan nama DLL filter, dalam urutan ini:
Dari CLSID yang terletak di:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters
Dari tipe konten file di:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type
Dari ekstensi nama file (sama dengan Win32 LoadIFilter API) di:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters
HKEY_CLASSES_ROOT\extpersistentHandler-CLSID-IID_IFilter-CLSID>>>
Dari Default pada:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters
Untuk Mendaftarkan Add-in Filter
Anda perlu membuat total delapan entri dalam registri untuk mendaftarkan add-in filter Anda, di mana:
- .ext adalah ekstensi nama file baru
- GUID_1 dapat berupa GUID baru yang dihasilkan untuk ekstensi ini
- 89BCB740-6119-101A-BCB7-00DD010655AF adalah GUID antarmuka IFilter, yang merupakan konstanta untuk semua implementasi IFilter.
Daftarkan handler persisten untuk ekstensi nama file dengan kunci dan nilai berikut:
HKEY_CLASSES_ROOT\<.ext>\PersistentHandler (Default) = {GUID_1}
HKEY_CLASSES_ROOT\CLSID\{GUID_1} (Default) = <Persistent Handler Description>
HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered (Default) = (Value Not Set)
HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF} (Default) = {CLSID of IFilter implementation}
HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentHandler (Default) = {GUID_1}
Daftarkan implementasi IFilter dengan kunci dan nilai berikut:
HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation} (Default) = Extension IFilter Description">
HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}\InprocServer32 (Default) = <DLL Install Path> ThreadingModel = Both
Daftarkan implementasi IFilter dengan Windows Desktop Search dengan kunci dan nilai berikut:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext> (Default) = {CLSID of IFilter implementation}"
Topik terkait
-
Referensi
-
Sumber Daya Lainnya