use of org.codelibs.fess.es.log.exentity.ClickLog in project fess by codelibs.
the class GoAction method index.
// ===================================================================================
// Attribute
//
// ===================================================================================
// Hook
// ======
// ===================================================================================
// Search Execute
// ==============
@Execute
public ActionResponse index(final GoForm form) throws IOException {
validate(form, messages -> {
}, () -> asHtml(virtualHost(path_Error_ErrorJsp)));
if (isLoginRequired()) {
return redirectToLogin();
}
Map<String, Object> doc = null;
try {
doc = searchService.getDocumentByDocId(form.docId, new String[] { fessConfig.getIndexFieldUrl(), fessConfig.getIndexFieldConfigId() }, getUserBean()).orElse(null);
} catch (final Exception e) {
logger.warn("Failed to request: " + form.docId, e);
}
if (doc == null) {
saveError(messages -> messages.addErrorsDocidNotFound(GLOBAL, form.docId));
return redirect(ErrorAction.class);
}
final String url = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class);
if (url == null) {
saveError(messages -> messages.addErrorsDocumentNotFound(GLOBAL, form.docId));
return redirect(ErrorAction.class);
}
if (fessConfig.isSearchLog()) {
final String userSessionId = userInfoHelper.getUserCode();
if (userSessionId != null) {
final SearchLogHelper searchLogHelper = ComponentUtil.getSearchLogHelper();
final ClickLog clickLog = new ClickLog();
clickLog.setUrl(url);
clickLog.setRequestedAt(systemHelper.getCurrentTimeAsLocalDateTime());
clickLog.setQueryRequestedAt(DfTypeUtil.toLocalDateTime(Long.parseLong(form.rt)));
clickLog.setUserSessionId(userSessionId);
clickLog.setDocId(form.docId);
clickLog.setQueryId(form.queryId);
if (form.order != null) {
clickLog.setOrder(form.order);
}
searchLogHelper.addClickLog(clickLog);
}
}
String hash;
if (StringUtil.isNotBlank(form.hash)) {
final String value = URLUtil.decode(form.hash, Constants.UTF_8);
final StringBuilder buf = new StringBuilder(value.length() + 100);
for (final char c : value.toCharArray()) {
if (CharUtil.isUrlChar(c) || c == ' ') {
buf.append(c);
} else {
try {
buf.append(URLEncoder.encode(String.valueOf(c), Constants.UTF_8));
} catch (final UnsupportedEncodingException e) {
// NOP
}
}
}
hash = buf.toString();
} else {
hash = StringUtil.EMPTY;
}
final String targetUrl = pathMappingHelper.replaceUrl(url);
if (isFileSystemPath(targetUrl)) {
if (fessConfig.isSearchFileProxyEnabled()) {
final ViewHelper viewHelper = ComponentUtil.getViewHelper();
try {
final StreamResponse response = viewHelper.asContentResponse(doc);
if (response.getHttpStatus().orElse(200) == 404) {
logger.debug("Not found: " + targetUrl);
saveError(messages -> messages.addErrorsNotFoundOnFileSystem(GLOBAL, targetUrl));
return redirect(ErrorAction.class);
}
return response;
} catch (final Exception e) {
logger.warn("Failed to load: " + doc, e);
saveError(messages -> messages.addErrorsNotLoadFromServer(GLOBAL, targetUrl));
return redirect(ErrorAction.class);
}
} else {
return redirect(targetUrl + hash);
}
} else {
return redirect(targetUrl + hash);
}
}
use of org.codelibs.fess.es.log.exentity.ClickLog in project fess by codelibs.
the class SearchLogHelper method processClickLogQueue.
protected void processClickLogQueue(final Queue<ClickLog> queue) {
final Map<String, Integer> clickCountMap = new HashMap<>();
final List<ClickLog> clickLogList = new ArrayList<>();
for (final ClickLog clickLog : queue) {
try {
final SearchLogBhv searchLogBhv = ComponentUtil.getComponent(SearchLogBhv.class);
searchLogBhv.selectEntity(cb -> {
cb.query().setQueryId_Equal(clickLog.getQueryId());
}).ifPresent(entity -> {
clickLogList.add(clickLog);
final String docId = clickLog.getDocId();
Integer countObj = clickCountMap.get(docId);
if (countObj == null) {
countObj = Integer.valueOf(1);
} else {
countObj = countObj.intValue() + 1;
}
clickCountMap.put(docId, countObj);
}).orElse(() -> {
logger.warn("Not Found for SearchLog: " + clickLog);
});
} catch (final Exception e) {
logger.warn("Failed to process: " + clickLog, e);
}
}
if (!clickLogList.isEmpty()) {
try {
final ClickLogBhv clickLogBhv = ComponentUtil.getComponent(ClickLogBhv.class);
clickLogBhv.batchInsert(clickLogList);
} catch (final Exception e) {
logger.warn("Failed to insert: " + clickLogList, e);
}
}
if (!clickCountMap.isEmpty()) {
final SearchService searchService = ComponentUtil.getComponent(SearchService.class);
try {
searchService.bulkUpdate(builder -> {
final FessConfig fessConfig = ComponentUtil.getFessConfig();
searchService.getDocumentListByDocIds(clickCountMap.keySet().toArray(new String[clickCountMap.size()]), new String[] { fessConfig.getIndexFieldDocId() }, OptionalThing.of(FessUserBean.empty()), SearchRequestType.ADMIN_SEARCH).forEach(doc -> {
final String id = DocumentUtil.getValue(doc, fessConfig.getIndexFieldId(), String.class);
final String docId = DocumentUtil.getValue(doc, fessConfig.getIndexFieldDocId(), String.class);
if (id != null && docId != null && clickCountMap.containsKey(docId)) {
final Integer count = clickCountMap.get(docId);
final Script script = new Script("ctx._source." + fessConfig.getIndexFieldClickCount() + "+=" + count.toString());
final Map<String, Object> upsertMap = new HashMap<>();
upsertMap.put(fessConfig.getIndexFieldClickCount(), count);
builder.add(new UpdateRequest(fessConfig.getIndexDocumentUpdateIndex(), fessConfig.getIndexDocumentType(), id).script(script).upsert(upsertMap));
}
});
});
} catch (final Exception e) {
logger.warn("Failed to update clickCounts", e);
}
}
}
Aggregations