Mengelompokkan Hasil Pencarian Menggunakan GroupingSearch
Paket org.apache.lucene.search.grouping Deskripsi
Modul ini dapat mengelompokkan hasil pencarian Lucene, dan bidang bernilai tunggal yang ditentukan dikumpulkan bersama. Misalnya, grup menurut bidang "Penulis", dokumen dengan nilai bidang "penulis" yang sama dibagi menjadi suatu grup.
Saat mengelompokkan, Anda perlu memasukkan beberapa informasi yang diperlukan:
1. Groupfield: Grup menurut bidang ini. Misalnya, jika Anda menggunakan bidang "Penulis" untuk dikelompokkan, maka buku -buku di setiap kelompok adalah penulis yang sama. Dokumen tanpa domain ini akan dibagi menjadi kelompok yang terpisah.
2. Grouport: Penyortiran grup.
3. TopnGroup: Berapa banyak kelompok yang dipertahankan. Misalnya, 10 berarti bahwa hanya 10 kelompok pertama yang dipertahankan.
4. Groupoffset: Cari grup grup mana yang diberi peringkat terlebih dahulu. Misalnya, 3 berarti mengembalikan 7 kelompok (dengan asumsi opngroup sama dengan 10). Ini sangat berguna dalam pagination, seperti hanya 5 grup yang ditampilkan per halaman.
5. Withingroupsort: Urutkan dokumen dalam grup. CATATAN: Perbedaan antara sini dan Grouport
6. WithGroupoffset: Cari dokumen mana yang diberi peringkat pertama di setiap kelompok.
Mengelompokkan hasil pencarian lebih mudah untuk menggunakan grupingsearch
Pengenalan dokumentasi API Groupingsearch:
Kelas kenyamanan untuk melakukan pengelompokan di lingkungan yang tidak terdistribusi.
Pengelompokan di lingkungan yang tidak didistribusikan
Peringatan: API ini bersifat eksperimental dan mungkin berubah dengan cara yang tidak kompatibel dalam rilis berikutnya.
Versi 4.3.1 digunakan di sini
Beberapa cara penting:
Kode contoh:
1. Pertama lihat kode indeks
IndexHelper kelas publik {dokumen privat; direktori direktori pribadi; indeks indeks privateWriter; Direktori publik getDirectory () {directory = (direktori == null)? RamDirectory baru (): direktori; Direktori Kembali; } private indexWriterConfig getConfig () {return new IndexWriterConfig (Version.lucene_43, New Ikanalyzer (true)); } private indexWriter getIndexWriter () {coba {return new indexWriter (getDirectory (), getConfig ()); } catch (ioException e) {e.printstacktrace (); kembali nol; }} indeks publik peneliti getIndexSearcher () melempar ioException {return new indexSearcher (directoryreader.open (getDirectory ())); } / ** * Buat indeks untuk tes grup * @param author * @param konten * / public void createIndexForGroup (int id, string worhor, string content) {indexWriter = getIndexWriter (); dokumen = dokumen baru (); document.add (intfield baru ("id", id, field.store.yes)); document.add (stringfield baru ("penulis", penulis, field.store.yes)); document.add (TextField baru ("konten", konten, field.store.yes)); coba {indexwriter.adddocument (dokumen); IndexWriter.Commit (); indexWriter.close (); } catch (ioException e) {e.printstacktrace (); }}}2. Pengelompokan:
Kelas Publik GroupestPublic Void Group (IndexSearcher IndexSearcher, String Groupfield, String Content) melempar IOException, ParseException {Groupingsearch GroupingSearch = GroupingSearch baru (GroupField); GroupingSearch.setGroupSort (Sort baru (sortfield.field_score)); GroupingSearch.SetFillSortFields (true); GroupingSearch.setCachingInmb (4.0, true); GroupingSearch.setAllGroups (true); //groupingsearch.setAllGroupheads(true); GroupingSearch.SetGroupDocsLimit (10); Queryparser parser = queryparser baru (versi.lucene_43, "konten", ikanyalyzer baru (true)); Kueri kueri = parser.parse (konten); TopGroups <teTesRef> result = GroupingSearch.Search (IndexSearcher, Query, 0, 1000); System.out.println ("pencarian hit:" + result.totalhitcount); System.out.println ("Pengelompokan hasil pencarian:" + result.groups.length); Dokumen dokumen; untuk (groupDocs <teTesRef> groupDocs: result.groups) {System.out.println ("Group:" + groupdocs.groupValue.utf8toString ()); System.out.println ("Catatan dalam kelompok:" + groupdocs.totalhits); //System.out.println("groupdocs.scoredocs.length: " + groupdocs.scoredocs.length); untuk (scorsoc scorsoc: groupdocs.scoredocs) {system.out.println (indexsearcher.doc (scorsoc.doc)); }}}3. Tes Sederhana:
public static void main (string [] args) melempar ioException, parseException {indexHelper indexHelper = new indexHelper (); indexhelper.createIndexforGroup (1, "ubi jalar", "open source china"); indexhelper.createIndexForGroup (2, "ubi jalar", "komunitas open source"); indexhelper.createIndexforGroup (3, "ubi jalar", "desain kode"); indexhelper.createIndexforGroup (4, "ubi jalar", "desain"); indexhelper.createIndexForGroup (5, "Jiexian", "Lucene Development"); indexhelper.createIndexForGroup (6, "Jiexian", "Lucene Practical Combat"); indexhelper.createIndexforGroup (7, "Jiexian", "Open Source Lucene"); IndexHelper.CreateIndexforGroup (8, "Jiexian", "Open Source Solr"); indexhelper.createIndexForGroup (9, "Sanxian", "Sanxian Open Source Lucene"); IndexHelper.CreateIndexforGroup (10, "Sanxian", "Sanxian Open Source Solr"); indexhelper.createIndexforGroup (11, "Sanxian", "Open Source"); Groupest Groupest = Groupest baru (); groupest.group (indexhelper.getIndexSearcher (), "penulis", "open source"); }} 4. Hasil tes:
Dua Cara Paging
Lucene memiliki dua cara paging:
1. Secara langsung memberi paginasi hasil pencarian. Metode ini dapat digunakan ketika volume data relatif kecil. Referensi inti dari kode paging adalah:
SCORCEOC [] sd = xxx; // kueri Mulai Posisi Catatan int Begin = PageSize * (currentpage - 1); // kueri mengakhiri posisi rekaman int end = math.min (begin+pagesize, sd.length); for (int i = i <end && i <totalhits; i ++) {// Data untuk pencarian proses;2. Gunakan SearchAfter (...)
Lucene menyediakan lima metode kelebihan beban yang dapat digunakan sesuai kebutuhan
SCORCEOC SETELAH: Kurangi jumlah total SCORCEOC untuk hasil pencarian terakhir dengan 1;
Kueri Kueri: Metode Kueri
Int N: Jumlah hasil yang dikembalikan untuk setiap kueri, yaitu, jumlah total hasil per halaman
Contoh sederhana menggunakan:
// Anda dapat menggunakan peta untuk menyimpan peta hasil pencarian yang diperlukan <string, object> resultMap = new HashMap <String, Object> (); scorsoc setelah = null; kueri kueri = xxtopdocs td = search.searchafter (setelah, kueri, ukuran); // dapatkan hit number resultMap.put ("num", td.totalhits); SCORCEOC [] SD = TD.Scoredocs; for (scoreCoc scorsoc: sd) {// Pemrosesan hasil pencarian klasik} // Hasil pencarian Jumlah total skorum dikurangi sebesar 1 setelah = sd [td.scoredocs.length - 1]; // Simpan setelah untuk pencarian berikutnya, yaitu, halaman berikutnya memulai resultMap.put ("setelah", setelah); pengembalian hasil hasil;