Windows Search'te filtre işleyicilerini anlama

IFilter arabiriminin uygulamaları olan filtre işleyicileri, belgeleri metin ve özellikler için tarar. Filtre işleyicileri bu öğelerden metin öbeklerini ayıklar, ekli biçimlendirmeyi filtreler ve metnin konumu hakkındaki bilgileri korur. Ayrıca, belge özellikleri olan değer öbeklerini de ayıklar. IFilter, belge dizin oluşturucuları ve uygulamadan bağımsız görüntüleyiciler gibi üst düzey uygulamalar oluşturmanın temelidir.

Bu konu aşağıdaki gibi düzenlenmiştir:

IFilter arabirimi hakkında

Microsoft Windows Search, öğelerin içeriğini tam metin dizinine eklemek üzere ayıklamak için filtreleri kullanır. İçeriği ayıklamak için filtreler ve dosyaların özelliklerini ayıklamak için özellik işleyicileri yazarak Yeni veya özel dosya türlerini dizine almak için Windows Search'ün kapsamını genişletebilirsiniz.

IFilter arabirimi, tam metin arama motorlarının belirli gereksinimlerini karşılayacak şekilde tasarlanmıştır. Windows Search gibi tam metin arama altyapıları, metin ve özellik bilgilerini ayıklamak ve bunları dizine eklemek için IFilter yöntemlerini çağırır. Windows Search, döndürülen IFilter::GetText yönteminin sonuçlarını sözcüklere ayırır, normalleştirir ve bir dizine kaydeder. Varsa, arama altyapısı dile özgü sözcük kesme ve normalleştirme gerçekleştirmek için metin öbeklerinin dil kodu tanımlayıcısını (LCID) kullanır.

Windows Search, kayıtlı filtre işleyicilerine (IFilter arabiriminin uygulamaları) erişmek için aşağıdaki tabloda açıklanan üç işlevi kullanır. Bu işlevler özellikle eklenmiş bir nesnenin filtre işleyicisine yüklenirken ve bağlanırken kullanışlıdır.

Fonksiyon Açıklama
LoadIFilter Belirtilen içerik türü için en uygun IFilter işaretçisini alır.
BindIFilterFromStorage IStorage Arabirimi nesnesinde bulunan içeriğe en uygun IFilter işaretçisini alır.
BindIFilterFromStream Belirtilen bir sınıf tanımlayıcısı (CLSID) için bir akış değişkeninden alınan en uygun IFilter işaretçisine ulaşır.

IFilter arabiriminin aşağıdaki tabloda açıklanan beş yöntemi vardır.

Yöntem Açıklama
IFilter::Init Bir filtreleme oturumu başlatır.
IFilter::GetChunk IFilter ilk veya sonraki parçanın başına konumlandırıp bir tanımlayıcı döndürür.
IFilter::GetText Geçerli öbekten metin alır.
IFilter::GetValue Geçerli öbekten değerleri alır.
IFilter::BindRegion Nesnenin belirtilen bölümünü temsil eden bir arayüz alır. Gelecekte kullanmak üzere ayrılmıştır.

Yalıtım işlemi

Windows Search, IFilters'ı kısıtlı haklara sahip Yerel Sistem güvenlik bağlamında çalıştırır. Bu IFilter konak yalıtım işleminde bir dizi hak kaldırılmaktadır.

  • Kısıtlanmış Kod
  • Herkes
  • Yerel
  • Etkileşimli
  • Kimliği Doğrulanmış Kullanıcılar
  • Yerleşik Kullanıcılar
  • Kullanıcıların güvenlik tanımlayıcısı (SID)

Bu hakların kaldırılması, IFilter arabiriminin disk sistemine veya ağına ya da herhangi bir kullanıcı arabirimine ya da pano işlevine erişimi olmadığı anlamına gelir. Ayrıca, yalıtım işlemi, alt işlemlerin oluşturulmasını engelleyen ve çalışma belleğine 100 MB'lık bir sınır uygulayan bir job object altında çalışır. IFilter arabirimi ana bilgisayar yalıtım işlemi, üçüncü taraf filtrelerin yanlış uygulanması olasılığı nedeniyle dizin oluşturma platformunun kararlılığını artırır.

Not

Filtre işleyicileri, arabellekleri yönetmek ve doğru bir şekilde yığmak için yazılmalıdır. Tüm dize kopyalarında arabellek taşmalarına karşı koruma sağlamak için açık denetimler olmalıdır. Arabelleğin tahsis edilmiş boyutunu her zaman doğrulamanız gerekir. Verilerin boyutunu her zaman tampon boyutuna göre kontrol etmelisiniz.

IFilter dll'leri

IFilter DLL'leri, istemcinin dosya türünden, sınıftan veya algılanan türden metin ve özellik değeri bilgilerini ayıklamasını sağlamak için IFilter arabirimini uygular. Windows Search filtreleme işlemi, öğenin sınıfı, algılanan türü veya ad uzantısı için kayıtlı olan IFilter'e SearchFilterHost.exe bağlanır.

IFilter yapısı

Her IFilter, belirtilen filtreleme özelliklerini sağlamak için bir işlem içi Bileşen Nesne Modeli (COM) sunucusu uygulayan bir DLL dosyasıdır. Aşağıdaki şekilde, tipik bir IFilter DLL'lerinin genel yapısı gösterilmektedir. Daha karmaşık bir örnek, birden çok IFilter sınıfı uygulayabilir.

Tipik bir ifilter dlldiagram of the structure of a typical ifilter dlldiagram of the structure of a typical ifilter dllyapısınındiyagramı

Yerel kod

Birden çok eklentinin çalıştığı işlemle ilgili olası ortak dil çalışma zamanı (CLR) sürüm oluşturma sorunları nedeniyle filtreler yerel kodda yazılmalıdır. Windows 7 ve sonraki sürümlerde, yönetilen kodda yazılan filtreler açıkça engellenir.

IFilter sınıf tanımlayıcısını bulma

IFilter DLL sınıfı PersistentHandler kayıt defteri anahtarı altında kaydedilir. Aşağıdaki örnek, HTML dosyaları için bir HTML belgesi için IFilter DLL'in nasıl bulunacağı gösterilmektedir. Bu örnek, sistem tarafından bir öğeyle ilişkilendirilmiş IFilter bulmak için kullanılana benzer bir mantık izler.

  1. DLL'in filtrelediği dosya türleri için uzantının \HKEY_LOCAL_MACHINE\SOFTWARE\Classeskayıt defteri girdisi altında bir PersistentHandler kaydedilip kaydedilmediğini kontrol edin. Bu anahtarın Value1olmasına izin verin. Bu girdi zaten varsa, bu prosedürün 4. adımına atlayın ve o anahtarda Value1'ı kullanın. Değerler REG_SZ türündedir.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Alternatif olarak, uzantı için kayıtlı bir PersistentHandler yoksa, \HKEY_LOCAL_MACHINE\SOFTWARE\Classeskayıt defteri girdisinin altında belge türüyle ilişkili CLSID'yi bulun. Bu anahtarın Value2olmasına izin verin.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Bir PersistentHandler'ın CLSID için kayıtlı olup olmadığını belirleyin. 2. adımda belirlenen Value2 kullanarak\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2 girdisinin PersistentHandler öğesini bulun. Bu anahtarın Value3olmasına izin verin.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. IFilter kalıcı işleyici GUID'sini belirleyin. Value1 ve Value3'i kullanarak, belge türü için IFilter Kalıcı İşleyici GUID bulun. \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 veya 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/ kayıt defteri girdisinin altındaki değer> bu belge türü için IFilter PersistentHandler GUID verir. Bu anahtarın Value4olmasına izin verin. Bu örnekte IFilter arabirimi GUID değeri 89BCB740-6119-101A-BCB7-00DD010655AF şeklindedir.
    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}

Not

Bu örnekte, DLL HTML belgeleri için IFilter nlhtml.dll.

IFilter::GetChunk ve yerel ayar kodu tanımlayıcıları

Metnin LCID'i tek bir dosya içinde değişebilir. Örneğin, bir yönerge kılavuzunun metni İngilizce (en-us) ile İspanyolca (es) arasında değişebilir veya metin birincil dil dışındaki bir dilde tek bir sözcük içerebilir. Her iki durumda da, IFilter, LCID her değiştiğinde yeni bir bölüm başlatmalıdır. LCID uygun bir sözcük ayırıcı seçmek için kullanıldığından, doğru şekilde tanımlamanız çok önemlidir. IFilter metnin yerel ayarını belirleyemiyorsa, öbekle birlikte sıfır değerinde bir LCID döndürmelidir. Sıfırdan bir LCID döndürmek, Windows Search'ün öbeğin yerel ayar kimliğini belirlemek için Dil Otomatik Algılama (LAD) teknolojisini kullanmasına neden olur. Windows Search eşleşme bulamazsa, varsayılan olarak sistem varsayılan yerel ayarına (GetSystemDefaultLocaleName İşlevi işlevi çağrılarak) kullanılır. Daha fazla bilgi için bkz. IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATEve STAT_CHUNK.

Dosya biçimini kontrol ediyorsanız ve halen yerel ayar verisi içermiyorsa, doğru yerel ayar tespiti için bir kullanıcı özelliği eklemeniz gerekir. Eşleşmeyen bir sözcük ayırıcı kullanmak, kullanıcı için kötü bir sorgu deneyimine neden olabilir. Daha fazla bilgi için bkz. IWordBreaker.

Not

Filtreler, dosya adı uzantıları, MIME türleri veya CLSID'ler tarafından belirtildiği gibi dosya türleriyle ilişkilendirilir. Bir filtre birden çok dosya türünü işleyebilir ancak her tür yalnızca bir filtreyle çalışır.

Ek kaynaklar

Filtre İşleyicileri Geliştirme

Windows Search 'da Filtre İşleyicileri Oluşturmak için En İyi Yöntemler

Filtre İşleyicisinden Özellik Döndürme

Windows ile Birlikte Sunulan Filtre İşleyicileri

Windows Arama'da Filtre İşleyicileri Uygulama

Filtre İşleyicilerini Kaydetme

Test Filtre İşleyicileri