Группировка результатов Solr в Solr 3.6.1 API вызывает исключение NullPointerException при разборе результата

1

Пока я ограничиваю свой запрос:

SolrQuery solrQuery = new SolrQuery();

solrQuery.set("q", query); //where query is solr query string (e.g. *:*)
solrQuery.set("start", 0);
solrQuery.set("rows", 10);

все работает нормально - результаты возвращаются и так далее.

Все становится хуже, когда я пытаюсь сгруппировать результаты по полю "Token_group", чтобы избежать дублирования:

SolrQuery solrQuery = new SolrQuery();

solrQuery.set("q", query); //where query is solr query string (e.g. *:*)
solrQuery.set("start", 0);
solrQuery.set("rows", 10);

solrQuery.set("group", true);
solrQuery.set("group.field", "token_group");
solrQuery.set("group.ngroups", true);
solrQuery.set("group.limit", 20);

Использование этого результата в HttpSolrServer не исключается, но попытки доступа к результатам заканчиваются в NPE.

Мой запрос метода Solr:

public SolrDocumentList query(SolrQuery query) throws SolrServerException {

    QueryResponse response = this.solr.query(query); //(this.solr is handle to HttpSolrSelver)
    SolrDocumentList list = response.getResults();

    return list;

}

обратите внимание, что подобная группировка (с использованием того же поля) производится в наших других приложениях (PHP) и работает отлично, поэтому это не проблема схемы.

Теги:
solr

1 ответ

5
Лучший ответ

Я решил проблему. Если кому-то это понадобится в будущем:

Когда вы выполняете групповой запрос, вы должны использовать разные методы для получения и анализа результатов. Пока в негрупповых запросах

QueryResponse response = this.solr.query(query); //(this.solr is handle to HttpSolrSelver)
SolrDocumentList list = response.getResults();

будет работать, когда вы хотите запросить группы, это не произойдет.

Итак, как мне сделать и анализировать запрос?

Ниже код для построения запроса отлично подходит:

SolrQuery solrQuery = new SolrQuery();

solrQuery.set("q", query); //where query is solr query string (e.g. *:*)
solrQuery.set("start", 0);
solrQuery.set("rows", 10);

solrQuery.set("group", true);
solrQuery.set("group.field", "token_group");
solrQuery.set("group.ngroups", true);
solrQuery.set("group.limit", 20);

где последние четыре строки определяют, что Solr должен группировать результаты и параметры группировки. В этом случае group.limit определит, сколько максимальных результатов в группе вы хотите, а rows расскажут, сколько максимальных результатов должно быть там.

Создание сгруппированного запроса выглядит так:

List<GroupCommand> groupCommands = this.solr.query(query).getGroupResponse().getValues();

ссылаясь на документацию, GroupCommand содержит информацию о группировке, а также список результатов, разделенных на группы.

Хорошо, я хочу получить результаты. Как это сделать?

Ну, в моем примере есть только одна позиция в List<GroupCommand> groupCommands, поэтому для получения списка найденных групп внутри нее:

GroupCommand groupCommand = groupCommands.get(0);

List<Group> groups = groupCommand.getValues();

Это приведет к списку групп. Каждая группа содержит свой собственный SolrDocumentList. Чтобы получить его:

for(Group g : groups){
    SolrDocumentList groupList = g.getResult();
    (...)
}

Имея это, достаточно просто перейти к SolrDocumentList для каждой группы.

Я использовал запрос группировки для получения списка отличных результатов. Как это сделать?

Это было мое дело. Кажется легким, но есть сложная часть, которая может вас поймать, если вы рефакторинг уже запущенного кода, который использует getNumFound() из SolrDocumentList.

Просто проанализируйте мой код:

/**
 * Gets distinct resultlist from grouped query
 * 
 * @param query
 * @return results list
 * @throws SolrServerException 
 */
public SolrDocumentList queryGrouped(SolrQuery query) throws SolrServerException {


    List<GroupCommand> groupCommands = this.solr.query(query).getGroupResponse().getValues();

    GroupCommand groupCommand = groupCommands.get(0);

    List<Group> groups = groupCommand.getValues();

    SolrDocumentList list = new SolrDocumentList();

    if(groups.size() > 0){

        long totalNumFound = groupCommand.getNGroups();

        int iteratorLimit = 1;

        for(Group g : groups){
            SolrDocumentList groupList = g.getResult();

            list.add(groupList.get(0));   

            //I wanted to limit list to 10 records    
            if(iteratorLimit++ > 10){
                break;
            }
        }

        list.setNumFound(totalNumFound);


    }

    return list;

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню