Bagikan melalui


Proses Kueri di Windows Search

Topik ini diatur sebagai berikut:

Kueri di Windows Search didasarkan pada empat pendekatan berikut:

AQS adalah sintaks kueri default yang digunakan oleh Windows Search untuk mengkueri indeks dan untuk memperbaiki dan mempersempit parameter pencarian. AQS terutama dihadapi pengguna, dan dapat digunakan oleh pengguna untuk membangun kueri AQS, tetapi juga dapat digunakan oleh pengembang untuk membangun kueri secara terprogram. Di Windows 7, AQS kanonis diperkenalkan dan harus digunakan untuk menghasilkan kueri AQS secara terprogram. Di Windows 7 dan yang lebih baru, opsi menu pintasan dapat tersedia berdasarkan apakah kondisi AQS terpenuhi. Untuk informasi selengkapnya, lihat "Mendapatkan Perilaku Dinamis untuk Kata Kerja Statis dengan Menggunakan Sintaks Kueri Tingkat Lanjut" dalam Membuat Penangan Menu Konteks. Kueri AQS dapat dibatasi pada jenis file tertentu, yang dikenal sebagai jenis file. Untuk informasi selengkapnya, lihat Jenis File dan Asosiasi. Untuk dokumentasi referensi tentang properti yang relevan, lihat System.Kind, dan System.KindText.

NQS adalah sintaks kueri yang lebih santai daripada AQS, dan mirip dengan bahasa manusia. NQS dapat digunakan oleh Windows Search untuk mengkueri indeks jika NQS dipilih alih-alih default, AQS.

SQL adalah bahasa teks yang mendefinisikan kueri. SQL umum di berbagai teknologi database. Windows Search menggunakan SQL, mengimplementasikan subsetnya, dan memperluasnya dengan menambahkan elemen ke bahasa. Windows Search SQL memperluas sintaks kueri database SQL-92 dan SQL-99 standar untuk meningkatkan kegunaannya dengan pencarian berbasis teks. Semua fitur Windows Search SQL kompatibel dengan Windows Search di Windows XP dan Windows Server 2003, dan yang lebih baru. Untuk informasi selengkapnya tentang Windows Search SQL, lihat Mengkueri Indeks dengan Sintaks SQL Pencarian Windows, dan Gambaran Umum Sintaks SQL Pencarian Windows.

API kueri terstruktur dijelaskan nanti dalam topik ini. Untuk dokumentasi referensi tentang API kueri terstruktur, lihat Antarmuka Kueri. Antarmuka seperti ISearchQueryHelper membantu membangun string SQL dari sekumpulan nilai input. Antarmuka ini mengonversi kueri pengguna AQS ke Windows Search SQL dan menentukan pembatasan kueri yang dapat diekspresikan dalam SQL tetapi tidak di AQS. ISearchQueryHelper juga mendapatkan string koneksi OLE DB untuk menyambungkan ke database Windows Search.

Kueri Lokal dan Jarak Jauh

Anda dapat menjalankan kueri Anda baik secara lokal atau jarak jauh. Kueri lokal yang menggunakan klausa FROM diperlihatkan dalam contoh berikut. Kueri lokal hanya mengkueri katalog SystemIndex lokal.

FROM SystemIndex

Kueri jarak jauh menggunakan klausa FROM diperlihatkan dalam contoh berikut. Menambahkan ComputerName mengubah contoh sebelumnya menjadi kueri jarak jauh.

FROM [<ComputerName>.]SystemIndex

Secara default, Windows XP dan Windows Server 2003 tidak menginstal Windows Search. Hanya Windows Search 4 (WS4) yang menyediakan dukungan kueri jarak jauh. Versi Windows Desktop Search (WDS) sebelumnya, seperti 3.01 dan yang lebih lama, tidak mendukung kueri jarak jauh. Dengan Windows Explorer Anda dapat mengkueri indeks lokal komputer jarak jauh untuk item sistem file (item yang ditangani oleh protokol "file:").

Untuk mengambil item menurut kueri jarak jauh, item harus memenuhi persyaratan berikut:

  • Dapat diakses melalui jalur Universal Naming Convention (UNC).
  • Ada di komputer jarak jauh yang dapat diakses klien.
  • Atur keamanannya untuk memungkinkan klien memiliki akses Baca.

Windows Explorer memiliki fitur untuk berbagi item, termasuk berbagi "Publik" (\\Machine\Public\...) di Pusat Jaringan dan Berbagi, dan berbagi "Pengguna" (\\Machine\Users\...) untuk item yang dibagikan melalui Wizard Berbagi. Setelah berbagi folder, Anda dapat mengkueri indeks lokal dengan menentukan nama komputer komputer jarak jauh dalam klausa FROM, dan jalur UNC di komputer jarak jauh dalam klausa SCOPE. Kueri jarak jauh yang menggunakan klausa FROM dan SCOPE diperlihatkan dalam contoh berikut.

SELECT System.ItemName FROM MachineName.SystemIndex WHERE SCOPE='file://MachineName/<path>' 

Contoh yang disediakan di sini menggunakan SQL.

Gambaran Umum API Kueri Terstruktur

Kueri terstruktur menyediakan kemampuan untuk mencari informasi dengan kombinasi kueri Boolean atas properti individual. Dalam topik ini kami menguraikan fungsionalitas API dan metode kueri terstruktur yang paling penting. Untuk dokumentasi referensi tentang API kueri terstruktur, lihat Antarmuka Kueri.

IQueryParser

Metode IQueryParser::P arse mengurai string input pengguna, dan menghasilkan interpretasi dalam bentuk IQuerySolution. Jika parameter pCustomProperties dari metode tersebut tidak null, maka itu adalah enumerasi objek IRichChunk (satu untuk setiap properti kustom yang dikenali). Metode IQueryParser lainnya mengizinkan aplikasi untuk mengatur beberapa opsi, seperti lokal, skema, pemecah kata, dan penangan untuk berbagai jenis entitas bernama. IQueryParser::GetSchemaProvider mengembalikan antarmuka ISchemaProvider untuk menelusuri skema yang dimuat.

IQuerySolution : IConditionFactory

Antarmuka IQuerySolution menyediakan semua informasi tentang hasil penguraian string input. Karena IQuerySolution juga merupakan antarmuka IConditionFactory , simpul pohon kondisi tambahan dapat dibuat. Metode IQuerySolution::GetQuery menghasilkan pohon kondisi untuk interpretasi. IQuerySolution::GetQuery juga mengembalikan jenis semantik.

IConditionFactory

IConditionFactory membuat simpul pohon kondisi. Jika parameter penyederhanaanIConditionFactory::MakeNotVARIANT_TRUE, maka ICondition yang dihasilkan disederhanakan, dan tidak perlu menjadi simpul negasi. Jika parameter pSubConditions dari IConditionFactory::MakeAndOr tidak null, maka parameter tersebut harus menjadi enumerasi objek ICondition , dan menjadi subtrees. IConditionFactory::MakeLeaf membuat simpul daun dengan nama, operasi, dan nilai properti tertentu. String dalam parameter pValueType harus menjadi nama jenis semantik dari skema. Jika parameter perluasVARIANT_TRUE dan properti adalah virtual, pohon kondisi yang dihasilkan biasanya merupakan disjunction yang dihasilkan dari memperluas properti ke konstituen yang ditentukan. Jika tidak null, parameter pPropertyNameTerm, pOperatorTerm, dan pValueTerm harus mengidentifikasi istilah yang menunjukkan properti, operasi, dan nilai.

ICondition : IPersistStream

Antarmuka ICondition adalah simpul tunggal di pohon kondisi. Simpul dapat menjadi simpul negasi, simpul AND, node OR, atau node daun. Untuk node non-daun ICondition::GetSubConditions mengembalikan enumerasi subtrees. Untuk node daun, metode ICondition berikut mengembalikan nilai berikut:

  • GetComparisonInfo mengembalikan nama properti, operasi, dan nilai.
  • GetValueType mengembalikan jenis semantik nilai, yang dikhususkan dalam parameter pszValueType dari IConditionFactory::MakeLeaf.
  • GetValueNormalization mengembalikan bentuk string dari nilai. (Jika nilai sudah berupa string, formulir ini akan dinormalisasi sehubungan dengan kasus, aksen, dan sebagainya.)
  • GetInputTerms mengembalikan informasi tentang bagian kalimat input mana yang menghasilkan nama properti, operasi, dan nilai.
  • Klon mengembalikan salinan mendalam dari pohon kondisi.

IRichChunk

Setiap objek IRichChunk mengidentifikasi rentang token dan string. IRichChunk adalah antarmuka utilitas yang mewakili informasi tentang rentang (biasanya rentang token) yang diidentifikasi dengan posisi awal dan panjang. Informasi rentang ini mencakup string dan/atau VARIAN.

IConditionGenerator

Antarmuka IConditionGenerator disediakan oleh aplikasi untuk menangani pengenalan dan pembuatan pohon kondisi untuk jenis entitas bernama. Generator kondisi diberikan ke IQueryParser melalui IQueryParser::SetMultiOption. IQueryParser memanggil IConditionGenerator::Initialize dengan ISchemaProvider untuk skema yang saat ini dimuat. Melakukannya memungkinkan IConditionGenerator untuk mendapatkan informasi skema apa pun yang diperlukan. Saat mengurai string input, IQueryParser memanggil metode IConditionGenerator::RecognizeNamedEntities dari setiap IConditionGenerator, sehingga kemunculan entitas bernama yang dikenalinya dalam string input dapat dilaporkan. IQueryParser dapat menggunakan lokal saat ini dan harus menggunakan tokenisasi input karena perlu melaporkan rentang token dari entitas bernama apa pun.

Ketika IQueryParser akan memancarkan node daun, dan jenis semantik nilai cocok dengan jenis entitas bernama untuk IConditionGenerator, IQueryParser memanggil IConditionGenerator::GenerateforLeaf dengan informasi untuk node yang akan dihasilkan. Jika IConditionGenerator mengembalikan S_OK, IConditionGenerator harus mengembalikan pohon kondisi (yang tidak harus menjadi simpul daun), dan memberi tahu IQueryParser apakah akan menekan interpretasi string alternatif yang biasanya dihasilkan sebagai tindakan pencegahan.

ITokenCollection

Metode ITokenCollection::NumberOfTokens mengembalikan jumlah token. ITokenCollection::GetToken mengembalikan informasi tentang token ith. Awal dan panjang adalah posisi karakter dalam string input. Teks yang dikembalikan tidak akan null hanya jika ada teks yang mengambil alih karakter dari string input. Ini digunakan, misalnya, untuk mengambil alih tanda hubung dalam string input dengan NOT ketika tanda hubung tersebut dalam konteks di mana tanda hubung tersebut harus ditafsirkan sebagai negasi.

INamedEntityCollector

IConditionGenerator memanggil INamedEntityCollector::Add untuk setiap entitas bernama yang dikenalinya. Rentangnya adalah rentang token. Harus selalu kasus yang beginSpan ? beginActual<endActual ? endSpan. beginSpan dan endSpan mungkin berbeda dari beginActual dan endActual jika entitas bernama dimulai dan/atau berakhir dengan token yang tidak signifikan secara semantik seperti tanda kutip (yang namun dicakup oleh entitas bernama). Nilai harus dinyatakan sebagai string dan kemudian akan muncul dalam panggilan ke IConditionGenerator::GenerateForLeaf.

ISchemaProvider

Antarmuka ISchemaProvider dapat digunakan untuk menelusuri skema yang dimuat untuk entitas (jenis) dan relasi (properti). Inilah yang dilakukan metode individual:

  • Entitas mengembalikan enumerasi setiap entitas (IEntity) dalam skema.
  • RootEntity mengembalikan entitas akar skema. Untuk skema datar, jenis utama setiap IQuerySolution dikembalikan.
  • GetEntity menemukan entitas berdasarkan nama dan mengembalikan S_FALSE jika tidak ada entitas tersebut dalam skema.
  • MetaData mengembalikan enumerasi antarmuka IMetaData .

IEntity

Antarmuka IEntity adalah entitas skema yang mewakili jenis yang memiliki nama, memiliki sejumlah hubungan bernama dengan jenis lain (properti), dan berasal dari entitas dasar. Inilah yang dilakukan metode individualnya:

IRelationship

Antarmuka IRelationship mewakili hubungan antara dua entitas: sumber dan tujuan. Inilah yang dilakukan metode individual:

  • IRelationship::IsReal melaporkan apakah hubungan itu nyata. Misalnya, jika entitas A berasal dari entitas B dan mewarisi hubungan bernama R dari entitas tersebut, A mungkin masih memiliki hubungannya sendiri bernama R. Namun, hubungan beween A dan R harus memiliki jenis tujuan yang sama dengan B, dan satu-satunya alasan untuk itu ada adalah untuk menyimpan metadata khusus untuk B. Hubungan B seperti itu dikatakan tidak nyata.
  • IRelationship::Medadata mengembalikan enumerasi antarmuka IMetaData , satu untuk setiap pasangan metadata entitas ini.
  • IRelationship::D efaultPhrase mengembalikan frasa default yang akan digunakan untuk hubungan ini dalam pemulihan. Setiap hubungan memiliki frasa default yang menunjukkannya untuk memfasilitasi pembuatan pohon kondisi AQS atau NQS.

IMetaData

Metadata adalah pasangan kunci-nilai yang masing-masing terkait dengan entitas, hubungan, atau seluruh skema. Karena kunci belum tentu unik, kumpulan metadata dapat dianggap sebagai multi-peta. IMetaData::GetData dipanggil untuk mengambil kunci dan nilai untuk pasangan metatdata.

Skenario Kueri

Skenario berikut ini menjelaskan penggunaan API kueri terstruktur di Windows Search dalam skenario kueri umum, seperti membuat pohon kondisi dan mengkueri indeks.

Ekstraksi Kondisi dan Penguraian Kueri

Saat kueri dibuat, cakupannya ditentukan dengan memberi tahu sistem tempat mencari. Ini membatasi hasil pencarian. Setelah cakupan ditentukan, filter diterapkan, dan set filter dikembalikan. Hasil pencarian dibatasi dengan membangun pohon kondisi dengan simpul daun, mirip dengan grafik. Kondisi tersebut kemudian diekstraksi. Pohon kondisi adalah kombinasi Boolean (AND, OR, NOT) kondisi daun, yang masing-masing berkaitan dengan properti, melalui operasi, dengan nilai. Simpul daun mewakili pembatasan pada satu properti ke nilai melalui beberapa operasi.

Pembatasan filter memerlukan ekspresi logis yang menjelaskan pembatasan. Menentukan ekspresi ini dimulai dengan antarmuka ICondition , yang digunakan untuk membuat satu simpul di pohon kondisi. Karena hanya ada satu kondisi dalam contoh berikut, pohon tidak berubah.

    
    [
        object,
        uuid(0FC988D4-C935-4b97-A973-46282EA175C8),
        pointer_default(unique)
    ]
    interface ICondition : IPersistStream
    {
        HRESULT GetConditionType([out, retval] CONDITION_TYPE* pNodeType);
        HRESULT GetSubConditions([in] REFIID riid, [out, retval, iid_is(riid)] void** ppv);
        [local] HRESULT GetComparisonInfo([out, annotation("__deref_opt_out")] LPWSTR *ppszPropertyName, [out, annotation("__out_opt")] CONDITION_OPERATION *pOperation, [out, annotation("__out_opt")] PROPVARIANT *pValue);
        HRESULT GetValueType([out, retval] LPWSTR* ppszValueTypeName);
        HRESULT GetValueNormalization([out, retval] LPWSTR* ppszNormalization);
        [local] HRESULT GetInputTerms([out, annotation("__out_opt")] IRichChunk** ppPropertyTerm, [out, annotation("__out_opt")] IRichChunk** ppOperationTerm, [out, annotation("__out_opt")] IRichChunk** ppValueTerm);
        HRESULT Clone([out, retval] ICondition** ppc);
    };


Jika ada lebih dari satu kondisi filter, maka AND dan operator Boolean lainnya digunakan untuk mencapai satu pohon. POHON AND dan POHON-OR mewakili hubungan dan perbedaan subtree mereka. Pohon NOT mewakili negasi subtree tunggalnya. AQS menyediakan pendekatan teks untuk mencapai ekspresi logis dengan operator Boolean, dan seringkali lebih sederhana.

Dalam contoh berikutnya kita mengonversi pohon kondisi (ICondition) menjadi bentuk visual. Pengurai kueri, menggunakan antarmuka IQueryParser , mengonversi ICondition menjadi string kueri berformat teks kaya (RTF). Metode IQueryParser::RestateToString mengembalikan teks kueri, sementara metode IQueryParser::P arse menghasilkan antarmuka IQuerySolution . Contoh berikut menunjukkan cara melakukan semua itu.

    [
        object,
        uuid(2EBDEE67-3505-43f8-9946-EA44ABC8E5B0),
        pointer_default(unique)
    ]
    interface IQueryParser : IUnknown
    {
        HRESULT Parse([in] LPCWSTR pszInputString, [in] IEnumUnknown* pCustomProperties, [out, retval] IQuerySolution** ppSolution);
        HRESULT SetOption([in] STRUCTURED_QUERY_SINGLE_OPTION option, [in] PROPVARIANT const* pOptionValue);
        HRESULT GetOption([in] STRUCTURED_QUERY_SINGLE_OPTION option, [out, retval] PROPVARIANT* pOptionValue);
        HRESULT SetMultiOption([in] STRUCTURED_QUERY_MULTIOPTION option, [in] LPCWSTR pszOptionKey, [in] PROPVARIANT const* pOptionValue);
        HRESULT GetSchemaProvider([out, retval] ISchemaProvider** ppSchemaProvider);
        HRESULT RestateToString([in] ICondition* pCondition, [in] BOOL fUseEnglish, [out] LPWSTR* ppszQueryString);
        HRESULT ParsePropertyValue([in] LPCWSTR pszPropertyName, [in] LPCWSTR pszInputString, [out, retval] IQuerySolution** ppSolution);
        HRESULT RestatePropertyValueToString([in] ICondition* pCondition, [in] BOOL fUseEnglish, [out] LPWSTR* ppszPropertyName, [out] LPWSTR* ppszQueryString);
    };

Input utama IQueryParser::P arse adalah string input pengguna yang akan diurai, tetapi aplikasi juga dapat menginformasikan pengurai kueri dari properti apa pun yang telah dikenali dalam input (dari sintaks khusus aplikasi). Output dari IQueryParser::P arse adalah IQuerySolution, yang menyediakan semua informasi yang berkaitan dengan pemanggilan penguraian tersebut. Ada metode untuk mendapatkan string input, bagaimana string input ditokenisasi, kesalahan penguraian apa pun, dan kueri yang diurai sebagai pohon kondisi, yang diwakili oleh ICondition. Contoh berikut menunjukkan ...

    [
        object,
        uuid(D6EBC66B-8921-4193-AFDD-A1789FB7FF57),
        pointer_default(unique)
    ]
    interface IQuerySolution : IConditionFactory
    {
        [local] HRESULT GetQuery([out, annotation("__out_opt")] ICondition** ppQueryNode, [out, annotation("__out_opt")] IEntity** ppMainType);
        HRESULT GetErrors([in] REFIID riid, [out, retval, iid_is(riid)] void** ppParseErrors);
        [local] HRESULT GetLexicalData([out, annotation("__deref_opt_out")] LPWSTR* ppszInputString, [out, annotation("__out_opt")] ITokenCollection** ppTokens, [out, annotation("__out_opt")] LCID* pLocale, [out, annotation("__out_opt")] IUnknown** ppWordBreaker);
    }    

    

Dalam contoh sebelumnya, IQuerySolution::GetQuery bisa mendapatkan informasi apa pun tentang kueri termasuk teks asli, token yang terdiri dari teks, atau pohon kondisi. Contoh kemungkinan nilai kueri yang dikembalikan tercantum dalam tabel berikut.

Contoh nilai kueri yang dikembalikan Deskripsi
author:relja OR author:tyler Teks kueri yang dikembalikan IQueryParser::RestateToString
?author?, ?:?, ?relja?, ?OR?, ?author?, ?:?, ?tyler? Perincian token
pohon kondisi yang belum terselesaikan Pohon kondisi yang belum terselesaikan

 

Pohon kondisi awal yang dikembalikan belum terselesaikan. Dalam pohon kondisi yang belum terselesaikan, referensi tanggal dan waktu, seperti date:yesterday, tidak dikonversi ke waktu absolut. Selain itu, properti virtual tidak diperluas. Properti virtual adalah properti yang bertindak sebagai agregat dari beberapa properti.

Misalnya, kueri kind:email from:reljai menghasilkan pohon kondisi yang belum terselesaikan dan teratasi berikut ini. Pohon kondisi yang belum terselesaikan berada di sebelah kiri, dan pohon kondisi yang diselesaikan ada di sebelah kanan.

pohon kondisi yang belum terselesaikan dan teratasi

Pohon yang diselesaikan dapat diperoleh dengan memanggil IConditionFactory::Resolve. Namun, melewati SQRO_DONT_RESOLVE_DATETIME membuat tanggal dan waktu tidak terselesaikan. Ada keuntungan dari pohon kondisi yang belum terselesaikan, karena pohon kondisi yang belum terselesaikan berisi informasi tentang kueri. Setiap simpul daun menunjuk ke token yang dikembalikan oleh IQuerySolution::GetLexicalData, yang sesuai dengan properti, operator, dan nilai saat menggunakan antarmuka IRichChunk . Contoh berikut menunjukkan ...

    interface ITokenCollection : IUnknown
    {
        HRESULT NumberOfTokens(ULONG* pCount);
        HRESULT GetToken([in] ULONG i, [out, annotation("__out_opt")] ULONG* pBegin, [out, annotation("__out_opt")] ULONG* pLength, [out, annotation("__deref_opt_out")] LPWSTR* ppsz);
    };

ICondition:: GetInputTerms([out, annotation("__out_opt")] 
IRichChunk** ppPropertyTerm, [out, annotation("__out_opt")] 
IRichChunk** ppOperationTerm, [out, annotation("__out_opt")] 
IRichChunk** ppValueTerm);

    interface IRichChunk : IUnknown
    {
        HRESULT GetData([out, annotation("__out_opt")] ULONG* pFirstPos, [out, annotation("__out_opt")] ULONG* pLength, [out, annotation("__deref_opt_out")] LPWSTR* ppsz, [out, annotation("__out_opt")] PROPVARIANT* pValue);
    }

Mengkueri Indeks

Ada beberapa pendekatan untuk mengkueri indeks. Beberapa didasarkan pada SQL dan lainnya didasarkan pada AQS. Anda juga dapat mengkueri indeks Pencarian Windows secara terprogram dengan menggunakan antarmuka kueri. Ada tiga antarmuka yang khusus untuk mengkueri indeks: ISearchQueryHelper, IRowsetPrioritization, dan IRowsetEvents. Untuk informasi konseptual, lihat Mengkueri Indeks Secara Terprogram.

Anda dapat mengembangkan kelas komponen atau pembantu untuk mengkueri indeks dengan menggunakan antarmuka ISearchQueryHelper . Antarmuka ini diimplementasikan sebagai kelas pembantu untuk ISearchCatalogManager (dan ISearchCatalogManager2), dan diperoleh dengan memanggil ISearchCatalogManager::GetQueryHelper. Untuk informasi konseptual, lihat Mengkueri Indeks dengan ISearchQueryHelper.

ISearchQueryHelper mengizinkan Anda untuk:

  • Dapatkan string koneksi OLE DB untuk menyambungkan ke database Windows Search.
  • Mengonversi kueri pengguna AQS ke Windows Search SQL.
  • Tentukan pembatasan kueri yang dapat diekspresikan di SQL tetapi tidak di AQS.

Prioritas pengindeksan dan peristiwa set baris didukung di Windows 7 dan yang lebih baru. Dengan IRowsetPrioritization , ada tumpukan prioritas yang memungkinkan klien meminta agar cakupan yang digunakan dalam kueri tertentu diberikan prioritas yang lebih tinggi dari normal. IRowsetEvents menyediakan pemberitahuan perubahan pada item dalam set baris, termasuk penambahan item baru, penghapusan item, dan modifikasi data item. Menggunakan pemberitahuan peristiwa set baris memastikan bahwa hasil untuk kueri yang ada seperbarui mungkin. Untuk informasi konseptual, lihat Prioritas Pengindeksan dan Peristiwa Set Baris di Windows 7.

Pengindeksan, Kueri, dan Pemberitahuan di Windows Search

Apa yang Disertakan dalam Indeks

Proses Pengindeksan di Windows Search

Proses Pemberitahuan di Windows Search

Persyaratan Pemformatan URL