Foros de discusión

Фильтр записей по датам в портлете asset publisher.

Alexey Klochkov, modificado hace 7 años.

Фильтр записей по датам в портлете asset publisher.

New Member Mensajes: 3 Fecha de incorporación: 20/05/16 Mensajes recientes
Доброго всем времени суток!

Необходимо сделать поисковой фильтр сетевых записей в портлете asset publisher по по датам публикации.
Разбирая исходники пришёл к выводу, что нужно хукать jsp файл где мы получаем hits и из него список с записями results:
Hits hits = AssetUtil.search(request, assetEntryQuery, start, end);
total = hits.getLength();
searchContainer.setTotal(total);
results = AssetUtil.getAssetEntries(hits);

Для чего были добавлена форма с двумя input-date полями и кнопкой, по нажатию которой должны показываться записи с соответствующей заданному промежутку дате публикации.

Соответственно поиск по ключевому слову, по заголовку или по одной дате работает отлично. Я создаю свой SearchContext, инициализирую его данными из requestа и добавляю ключевое слово:
SearchContext searchContext = SearchContextFactory.getInstance(request);

searchContext.setKeywords("publishDate:20160628");

Hits hits = AssetUtil.search(searchContext, assetEntryQuery, start, end);

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

Далее прочитав следующую статью попытался сделать через:
TermRangeQuery termRangeQuery = TermRangeQueryFactoryUtil.create(searchContext, "publishDate", dateFrom, DateTo, true, true);

Hits hits = SearchEngineUtil.search(searchContext, termRangeQuery);

Но тут появились 2 проблемы:
1) В результат включаются все записи, даже старых версий (если запись изменялась).
2) Если например выставлена настройка отображать 20 записей на странице, а в результате поиска их больше, то на первой странице выводились все записи попадающие в данных промежуток и если их меньше 20, то соответственно страница оставалась незаполненной, а при переходе на следующую поисковой запрос сбрасывался и выводились все записи, которые были там изначально.

P.S. В lifereyе и вообще в веб разработке я новый человек, поэтому многого могу банально не понимать. В общем то думаю все мои проблемы как раз из-за недопонимания.
В любом случае заранее спасибо за ваше внимание!
Alexey Klochkov, modificado hace 7 años.

RE: Фильтр записей по датам в портлете asset publisher.

New Member Mensajes: 3 Fecha de incorporación: 20/05/16 Mensajes recientes
Получается искать ещё таким способом:

DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(AssetEntry.class);
Criterion criterion = RestrictionsFactoryUtil.between("publishDate", dateFrom, dateTo);
dynamicQuery.add(criterion);

total =  (int) AssetEntryLocalServiceUtil.dynamicQueryCount(DynamicQueryFactoryUtil.forClass(AssetEntry.class).add(criterion));
searchContainer.setTotal(total);

results = AssetEntryLocalServiceUtil.dynamicQuery(dynamicQuery, start, end);

Но остаётся проблема сохранения данных из input-date, при переходе на следующую страницу отображения результатов.
Alexey Klochkov, modificado hace 7 años.

RE: Фильтр записей по датам в портлете asset publisher. (Respuesta)

New Member Mensajes: 3 Fecha de incorporación: 20/05/16 Mensajes recientes
Проблема давно решена, выложу тут своё решение:

Тут используется lucene search, пришлось немного погуглить, но так работает хорошо, плюс настройка тагов в админке, чтобы контент для конкретного портлета фильтровать можно было.

SearchContext searchContext = SearchContextFactory.getInstance(request);
SimpleDateFormat dateKeywordFormat = new SimpleDateFormat("yyyyMMdd");
searchContext.setKeywords("publishDate:[" + dateKeywordFormat.format(dateFrom) + " TO " + dateKeywordFormat.format(dateTo) + "]");
Hits hits = AssetUtil.search(searchContext, assetEntryQuery, start, end);

total = hits.getLength();

searchContainer.setTotal(total);

results = AssetUtil.getAssetEntries(hits);