Здравствуйте. У меня есть выборка views, отображающая пользователей, проиндексированных в apache solr. Хочу отсортировать пользователей таким образом, чтобы в самом начале были те, кто когда-либо разместил хоть один материал.
Кто-нибудь сталкивался с решением подобной задачи?
Заранее спасибо за помощь!
Комментарии
SELECT COUNT(nid) AS countnid,
FROM node
ORDER BY countnid ASC'"
А вообще надо смотреть запрос ,кто его знает какие там таблицы,может вьюхой и не получится
select nid as countnid from node order by(select count(nid) from node)
то бишь так..ну или типо того..
Вы просто разорвали всех друпалеров в клочья!
Во вьюсе вы этого не сделаете никак. Так как можете оперировать там только индексированными данными из Solr. Как вариант, то можно ловить данные в шаблоне и там шаманить. Но тогда побьется пейджер. Но скорее всего придется писать свой виджет для вьюса. Все еще зависит от того, куда вы хотите вывести данные. В блок или на страницу. Но мне не совсем понятно, зачем пользователей индексировать? У вас миллионы пользователей с кучей полей по которым постоянно происходит поиск? Вы бы еще таблицу ролей проиндексировали в Solr (сарказм).
Как я понял это не совсем то. Похоже на то, что это способ сортировать материалы, а не пользователей. Поправьте если ошибаюсь.
А почему бы и нет? Полей много, есть фасетный поиск по ним, а если есть фасетный поиск, то почему бы и apache solr не подключить...
Задача конечно не из простых, но всё равно спасибо за идеи.
Чтобы сделать подобное, включите пользователей материала в индекс(то есть, индексируете ноды с полями авторов), иначе, при любых манипуляциях с views в обход с search api и facet api у Вас возникнут проблемы вида - на фесете написано, что например, в категории рубашек 65 материалов, а отображаются почему-то только 40, что, согласитесь, не красиво.
НУ или если Вам не надо связывать эту задачу с поиском, а просто нужно вывести пользователей, у которых есть материалы, то либо создаете вьювс материала, в котором в relations указываете таблицу пользователей, и выводите этих самых пользователей, либо наоборот, вьюху пользователей с обязательным relation ноды, но если галки "обязательная связь" не хватит, то тут возможно понадобится добавить фильтр uid >= 0(не помню есть ли там в фильтрах not isNull), такой вариант может оказаться самым запутанным, потому его не советую.
Хотя хрень написал, судя по названию топика, Вам нужна именно сортировка по кол-ву материала у пользователя, тут в голову по приходит только - реализовать как раз через Search API, индекс по пользователям, а в полях число материала(если в возможных индексируемых полях такого пункта нет, то можно написать свой плагин к Search API, там должно получиться буквально 3 строки(давно не писал к нему плагины, так что Вам придется курить маны по плагинам Serach API, так же, скорее всего, придется добавить обновление записи в индексе при добавлении/удалении ноды). И когда создадите вьюху по этому индексу - просто добавьте сортировку по этому полю по убыванию.
Ваша первая идея была верной. Нужно индексировать ноду с включением в индекс поля автора. Выводить ноды сгруппировав их по автору. И указав сортировку по группе (если будет такая возможность). А плагины к поисковому АПИ ничего не знают о ваших нодах и способах их сортировки, так как данные вы выводите через вьюсы.
Но опять таки, вопрос остался актуальным, куда вы вывод делаете? Если в блок, то задача простая, как угол дома.
Это вьювс, вывод можно делать куда душе угодно - блок/страница/xml/в другую вьюху и т.д.
Там на самом деле не совсем плагины, я ошибся, а дополнительное свойство сущности, например:
$properties = &$info['user']['properties'];
$properties['mcount'] = array(
'type' => 'integer',
'label' => t('Node count'),
'sanitized' => TRUE,//дабы не вызывать всяких check_plain ибо тут это не имеет смысла
'getter callback' => 'mcount_getter_callback',//геттер этого свойства
);
}
function mcount_getter_callback($item){
return db_query("SELECT COUNT(*) FROM {node} WHERE uid = :uid", array(
':uid' => $item->uid,
))->fetchField();
}
тут вроде бы будет казаться, что все замечательно, но, т.к. индекс будет по сущностям user, а это новое свойство целиком и полностью зависит от сущности node, надо будет при добавлении и удалении ноды обновлять запись в индексе user, сделать это можно в соответствующих хуках при помощи search_api_track_item_change($type, array $item_ids) (вроде)
В контексте задачи, я думаю, может проще тянуть из базы в блок одним запросом?
Хотя теоретизировать можно по разному.
Но не вижу смысла, здесь использовать, что-то более сложное