تجميع نتائج البحث باستخدام GroupingSearch
حزمة org.apache.lucene.search.grouping الوصف
يمكن لهذه الوحدة أن تجمع نتائج بحث Lucene ، ويتم جمع الحقول ذات القيمة الواحدة المحددة معًا. على سبيل المثال ، المجموعة وفقًا لحقل "المؤلف" ، يتم تقسيم المستندات التي تحمل نفس قيمة الحقل "المؤلف" إلى مجموعة.
عند التجميع ، تحتاج إلى إدخال بعض المعلومات اللازمة:
1. Groupfield: Group وفقًا لهذا المجال. على سبيل المثال ، إذا كنت تستخدم حقل "المؤلف" للمجموعة ، فإن الكتب في كل مجموعة هي نفس المؤلف. سيتم تقسيم المستندات بدون هذا المجال إلى مجموعة منفصلة.
2. المجموعات: فرز المجموعة.
3. مجموعات TopNgroups: كم عدد المجموعات التي يتم الاحتفاظ بها. على سبيل المثال ، 10 يعني أنه يتم الاحتفاظ فقط بالمجموعات العشرة الأولى.
4. Groupoffset: ابحث عن مجموعات المجموعات في المرتبة الأولى. على سبيل المثال ، 3 يعني إرجاع 7 مجموعات (على افتراض Opngroups تساوي 10). إنه مفيد للغاية في ترقيم الصفحات ، مثل 5 مجموعات فقط يتم عرضها في كل صفحة.
5. withingroupsort: فرز المستندات في مجموعات. ملاحظة: الفرق بين هنا و Groupsort
6. withGroupoffset: ابحث عن المستندات المرتبة الأولى في كل مجموعة.
نتائج البحث في التجميع أسهل في استخدام GroupingSearch
مقدمة توثيق واجهة API الخاصة بـ GroupingSearch:
فئة الراحة لأداء التجميع في بيئة غير موزعة.
التجميع في بيئات غير موزعة
تحذير: واجهة برمجة التطبيقات هذه تجريبية وقد تتغير بطرق غير متوافقة في الإصدار التالي.
يتم استخدام الإصدار 4.3.1 هنا
بعض الطرق المهمة:
نموذج الرمز:
1. انظر أولاً إلى رمز الفهرس
الفئة العامة indexHelper {وثيقة الوثيقة الخاصة ؛ دليل الدليل الخاص ؛ IndexWriter Private IndexWriter ؛ الدليل العام getDirectory () {directory = (دليل == فارغ)؟ New Ramdirectory (): دليل ؛ دليل العودة ؛ } private indexTwriterConfig getConfig () {return new IndexWriterConfig (version.lucene_43 ، new ikanalyzer (true)) ؛ } indexWriter private getIndexWriter () {try {return new IndexWriter (getDirectory () ، getConfig ()) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ العودة لاغية. }} indexsearcher getIndexSearcher () يلقي iOexception {return new indexsearcher (directoryReader.open (getDirectory ())) ؛ } / ** * إنشاء فهرس لاختبار المجموعة * param المؤلف * param content * / public void createIndExforGroup (int id ، string uptor ، string content) {indexWriter = getIndexWriter () ؛ وثيقة = مستند جديد () ؛ document.add (new intfield ("id" ، id ، field.store.yes)) ؛ document.add (New Stringfield ("المؤلف" ، مؤلف ، field.store.yes)) ؛ document.add (New TextField ("Content" ، Content ، Field.store.yes)) ؛ حاول {indexWriter.adddocument (وثيقة) ؛ indexWriter.Commit () ؛ indexWriter.Close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}2. التجميع:
مجموعة Grouptestpublic Void Group (IndexSearcher IndexSearcher ، String Groupfield ، String Content) يلقي IoException ، ParseException {GroupingSearch Groupingsearch = New Groupingsearch (Groupfield) ؛ Groupingsearch.setGroupSort (Sortfield.field_score)) ؛ Groupingsearch.setFillSortFields (True) ؛ Groupingsearch.setCachingInMb (4.0 ، true) ؛ GroupingSearch.setAllGroups (true) ؛ //groupingsearch.setallgroupheads(true) ؛ Groupingsearch.setGroupDocslimit (10) ؛ QueryParser parser = new QueryParser (الإصدار. استعلام الاستعلام = parser.parse (المحتوى) ؛ TopGroups <BytesRef> result = GroupingSearch.search (INSPESSEARD ، QUERY ، 0 ، 1000) ؛ System.out.println ("Search Hits:" + result.totalhitcount) ؛ System.out.println ("مجموعة نتائج البحث:" + result.groups.length) ؛ وثيقة الوثيقة ؛ لـ (groupdocs <BytesRef> groupdocs: result.groups) {system.out.println ("group:" + groupdocs.groupvalue.utf8toString ()) ؛ System.out.println ("سجل في المجموعة:" + groupdocs.totalhits) ؛ //system.out.println("groupdocs.scoredocs.length: " + groupdocs.scoredocs.length) ؛ لـ (scoredoc scoredoc: groupdocs.scoredocs) {system.out.println (indexsearcher.doc (scoredoc.doc)) ؛ }}}3. اختبار بسيط:
الفراغ الثابت العام (سلسلة [] args) يلقي ioException ، parseException {indexhelper indexHelper = new indexHelper () ؛ indexHelper.CreateIndExforGroup (1 ، "Sweet Potato" ، "Open Source China") ؛ indexhelper.createindexforgroup (2 ، "Sweet Potato" ، "Open Source Community") ؛ indexhelper.createindexforgroup (3 ، "Sweet Potato" ، "Code Design") ؛ indexhelper.createindexforgroup (4 ، "Sweet Potato" ، "Design") ؛ indexhelper.createindexforgroup (5 ، "Jiexian" ، "Lucene Development") ؛ indexhelper.createIndExforGroup (6 ، "Jiexian" ، "Lucene العملي القتال") ؛ 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 Sould Solr") ؛ indexhelper.createIndExforGroup (11 ، "Sanxian" ، "Open Source") ؛ grouptest grouptest = new grouptest () ؛ grouptest.group (indexhelper.getIndexSearcher () ، "uptor" ، "Open Source") ؛ }} 4. نتائج الاختبار:
طريقتان للترحيل
لدى لوكين طريقتان للترحيل:
1. تراجع مباشرة نتائج البحث. يمكن استخدام هذه الطريقة عندما يكون حجم البيانات صغيرًا نسبيًا. المرجع الأساسي لرمز الترحيل هو:
Scoredoc [] sd = xxx ؛ // Query Start start موضع السجل int int begin = pagesize * (currentpage - 1) ؛ // Query إنهاء السجل الموضع int end = math.min (start+pagesize ، sd.length) ؛ for (int i = begin ؛ i <end && i <totalhits ؛ i ++)
2. استخدم SearchAfter (...)
يوفر Lucene خمسة طرق تحميل زائدة يمكن استخدامها حسب الحاجة
Scoredoc بعد: قلل من إجمالي كمية ScoredOC لنتيجة البحث الأخيرة بمقدار 1 ؛
استعلام الاستعلام: طريقة الاستعلام
int n: عدد النتائج التي تم إرجاعها لكل استعلام ، أي إجمالي عدد النتائج لكل صفحة
مثال بسيط على استخدام:
// يمكنك استخدام MAP لحفظ خريطة نتائج البحث اللازمة <string ، Object> resultMap = new HashMap <string ، Object> () ؛ Scoredoc بعد = null ؛ استعلام Query = xxtopdocs td = search.searchafter (بعد ، الاستعلام ، الحجم) ؛ // احصل على رقم HIT REDORDMAP.PUT ("num" ، td.totalhits) ؛ scoredoc [] sd = td.scoredocs ؛ لـ (scoredoc scoredoc: sd) {// معالجة نتائج البحث الكلاسيكية} // نتائج البحث يتم تخفيض المبلغ الإجمالي بمقدار 1 بعد = sd [td.scoredocs.length - 1] ؛ // حفظ بعد البحث التالي ، أي أن الصفحة التالية تبدأ resultmap.put ("بعد" ، بعد) ؛ return resultmap ؛