Группировка результатов поиска с использованием GroupingSearch
Пакет org.apache.lucene.search.grouping Описание
Этот модуль может группировать результаты поиска Lucene, и указанные однозначные поля собираются вместе. Например, группа в соответствии с полем «Автор» документы с тем же значением поля «автора» делятся на группу.
При группировке вам необходимо ввести некоторую необходимую информацию:
1. Группа: Группа в соответствии с этой областью. Например, если вы используете поле «Автор» для группы, то книги в каждой группе являются одним и тем же автором. Документы без этого домена будут разделены на отдельную группу.
2. Groupsort: групповая сортировка.
3. TopNgroups: сколько групп сохраняется. Например, 10 означает, что только первые 10 групп сохраняются.
4. Например, 3 означает возвращение 7 групп (при условии, что OpnGroups равны 10). Это очень полезно в странице, например, только 5 групп отображается на страницу.
5. WithingRoupsort: сортируйте документы в группах. Примечание: разница между здесь и Groupsort
6. WithGroupOffset: Поиск, для которых документы заняли первое место в каждой группе.
Результаты группировки поиска проще использовать GroupingSearch
Groupingsearch API документация Введение:
Удобный класс для выполнения группировки в не распределенной среде.
Группировка в не распределенных средах
Предупреждение: этот API является экспериментальным и может измениться несовместимыми способами в следующем выпуске.
Версия 4.3.1 используется здесь
Некоторые важные способы:
Пример кода:
1. Сначала посмотрите на индексный код
Public Class Indexhelper {Private Document Document; Справочник частного каталога; частное индексное индексное авторитет; public Directory getDirectory () {Directory = (Directory == NULL)? new Ramdirectory (): каталог; возвратный каталог; } private indexWriterConfig getConfig () {return new IndexWriterConfig (version.lucene_43, new Ikanalyzer (true)); } private indexwriter getIndexWriter () {try {return new IndexWriter (getDirectory (), getConfig ()); } catch (ioException e) {e.printstackTrace (); вернуть ноль; }} public IndexSearcher getIndexSearcher () Throws IOException {return New IndexSearcher (DirectoryReader.Open (getDirectory ())); } / ** * Создать индекс для группового теста * @param Автор * @param content * / public void createIndexforGroup (INT ID, String Author, String Content) {indexWriter = getIndexWriter (); document = new Document (); 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)); try {indexwriter.adddocument (document); indexwriter.commit (); indexwriter.close (); } catch (ioException e) {e.printstackTrace (); }}}2. Группировка:
Общедоступный класс Grouptestpublic void Group (IndexSearcher IndexSearcher, String Groupfield, String Content) Throws IOException, ParseException {GroupingSearch GroupingSearch = New GroupingSearch (GroupField); groupingsearch.setGroupSort (новый Sort (sortfield.field_score)); GroupingSearch.SetFillSortFields (True); GroupingSearch.setCachingInmb (4.0, True); GroupingSearch.setAllGroups (TRUE); //groupingsearch.setallgroupheads(true); GroupingSearch.SetGroupDocSlimit (10); Queryparser parser = new queryparser (version.lucene_43, "content", new Ikanalyzer (true)); Query Query = parser.parse (content); TopGroups <BytesRef> result = GroupingSearch.search (IndexSearcher, Query, 0, 1000); System.out.println ("Поиск хитов:" + result.totalhitcount); System.out.println ("Результаты поиска группировка:" + result.groups.length); Документ документ; for (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); for (Scoredoc Scoredoc: GroupDocs.scoredocs) {System.out.println (indexsearch.doc (scoredoc.doc)); }}}3. Простой тест:
public static void main (string [] args) бросает ioException, parseException {indexHelper indexHelper = new IndexHelper (); indexHelper.createIndexforGroup (1, «сладкий картофель», «Китай с открытым исходным кодом»); indexHelper.createIndexforGroup (2, «сладкий картофель», «Сообщество с открытым исходным кодом»); indexHelper.createIndexforGroup (3, "сладкий картофель", "Код дизайн"); indexHelper.createIndexforGroup (4, "сладкий картофель", "дизайн"); indexHelper.createIndexforGroup (5, "jiexian", "Lucene Development"); indexHelper.createIndexforGroup (6, "jiexian", "Lucene Practical Combat"); indexHelper.createIndexforGroup (7, "jiexian", "Открытый исходный код Lucene"); indexHelper.createIndexforGroup (8, "jiexian", "Solr с открытым исходным кодом"); indexHelper.createIndexforGroup (9, "Sanxian", "Sanxian с открытым исходным кодом Lucene"); indexHelper.createIndexforGroup (10, "Sanxian", "Sanxian с открытым исходным кодом Solr"); indexHelper.createIndexforGroup (11, "Sanxian", "Open Source"); Grouptest grouptest = new Grouptest (); grouptest.group (indexhelper.getindexsearcher (), «Автор», «Открытый исходный код»); }} 4. Результаты теста:
Два способа пейджинг
У Лукена есть два способа подкурорки:
1. непосредственно на пчел результатов поиска. Этот метод может использоваться, когда объем данных относительно невелик. Основная ссылка на код пьеса:
Scoredoc [] sd = xxx; // Query Start Record Record Position int begin = pagesize * (currentPage - 1); // Запрос завершить позицию записи int end = math.min (begin+pagesize, sd.length); для (int i = begin; i <end && i <totalHits; i ++) {// код для обработки результатов поиска2. Используйте Searchafter (...)
Lucene предоставляет пять методов перегрузки, которые можно использовать по мере необходимости
Scoredoc после: уменьшить общую сумму ScoredOC для последнего результата поиска на 1;
Запрос запроса: метод запроса
int n: количество результатов, возвращаемых для каждого запроса, то есть общее количество результатов на страницу
Простой пример использования:
// Вы можете использовать карту для сохранения необходимых результатов поиска карта <строка, объект> resultmap = new Hashmap <String, Object> (); ScoredOc After = null; Query Query = xxtopdocs td = search.searchafter (после, Query, size); // Получить номер нажатия resultmap.put ("num", td.totalhits); Scoredoc [] sd = td.scoredocs; Для (Scoredoc Scoredoc: SD) {// Классическая обработка результатов поиска} // Результаты поиска Общая сумма ScoredOCS уменьшается на 1 после = SD [td.scoredocs.length - 1]; // Сохранить после следующего поиска, то есть следующая страница запускает resultmap.put («после», после); вернуть результат -карт;