fix #2283 add getCachedFacetResponse
This commit is contained in:
parent
458490d00a
commit
40e226364d
17 changed files with 140 additions and 74 deletions
|
@ -46,13 +46,13 @@ import org.codelibs.fess.Constants;
|
|||
import org.codelibs.fess.api.BaseApiManager;
|
||||
import org.codelibs.fess.api.WebApiManager;
|
||||
import org.codelibs.fess.api.WebApiRequest;
|
||||
import org.codelibs.fess.app.service.SearchService;
|
||||
import org.codelibs.fess.entity.FacetInfo;
|
||||
import org.codelibs.fess.entity.GeoInfo;
|
||||
import org.codelibs.fess.entity.HighlightInfo;
|
||||
import org.codelibs.fess.entity.SearchRenderData;
|
||||
import org.codelibs.fess.entity.SearchRequestParams;
|
||||
import org.codelibs.fess.exception.InvalidAccessTokenException;
|
||||
import org.codelibs.fess.helper.SearchHelper;
|
||||
import org.codelibs.fess.mylasta.direction.FessConfig;
|
||||
import org.codelibs.fess.util.ComponentUtil;
|
||||
import org.codelibs.fess.util.DocumentUtil;
|
||||
|
@ -115,7 +115,7 @@ public class GsaApiManager extends BaseApiManager implements WebApiManager {
|
|||
}
|
||||
|
||||
protected void processSearchRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
|
||||
final SearchService searchService = ComponentUtil.getComponent(SearchService.class);
|
||||
final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
final boolean xmlDtd = OUTPUT_XML.equals(request.getParameter("output"));
|
||||
|
||||
|
@ -133,7 +133,7 @@ public class GsaApiManager extends BaseApiManager implements WebApiManager {
|
|||
final SearchRenderData data = new SearchRenderData();
|
||||
final GsaRequestParams params = new GsaRequestParams(request, fessConfig);
|
||||
query = params.getQuery();
|
||||
searchService.search(params, data, OptionalThing.empty());
|
||||
searchHelper.search(params, data, OptionalThing.empty());
|
||||
final String execTime = data.getExecTime();
|
||||
final long allRecordCount = data.getAllRecordCount();
|
||||
final List<Map<String, Object>> documentItems = data.getDocumentItems();
|
||||
|
|
|
@ -37,7 +37,6 @@ import org.codelibs.core.lang.StringUtil;
|
|||
import org.codelibs.fess.Constants;
|
||||
import org.codelibs.fess.api.BaseJsonApiManager;
|
||||
import org.codelibs.fess.app.service.FavoriteLogService;
|
||||
import org.codelibs.fess.app.service.SearchService;
|
||||
import org.codelibs.fess.entity.FacetInfo;
|
||||
import org.codelibs.fess.entity.GeoInfo;
|
||||
import org.codelibs.fess.entity.HighlightInfo;
|
||||
|
@ -51,6 +50,7 @@ import org.codelibs.fess.helper.LabelTypeHelper;
|
|||
import org.codelibs.fess.helper.PopularWordHelper;
|
||||
import org.codelibs.fess.helper.RelatedContentHelper;
|
||||
import org.codelibs.fess.helper.RelatedQueryHelper;
|
||||
import org.codelibs.fess.helper.SearchHelper;
|
||||
import org.codelibs.fess.helper.SystemHelper;
|
||||
import org.codelibs.fess.helper.UserInfoHelper;
|
||||
import org.codelibs.fess.mylasta.direction.FessConfig;
|
||||
|
@ -131,7 +131,7 @@ public class JsonApiManager extends BaseJsonApiManager {
|
|||
}
|
||||
|
||||
protected void processScrollSearchRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
|
||||
final SearchService searchService = ComponentUtil.getComponent(SearchService.class);
|
||||
final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
|
||||
if (!fessConfig.isAcceptedSearchReferer(request.getHeader("referer"))) {
|
||||
|
@ -149,7 +149,7 @@ public class JsonApiManager extends BaseJsonApiManager {
|
|||
final JsonRequestParams params = new JsonRequestParams(request, fessConfig);
|
||||
try {
|
||||
response.setContentType("application/x-ndjson; charset=UTF-8");
|
||||
final long count = searchService.scrollSearch(params, doc -> {
|
||||
final long count = searchHelper.scrollSearch(params, doc -> {
|
||||
buf.setLength(0);
|
||||
buf.append('{');
|
||||
boolean first2 = true;
|
||||
|
@ -208,7 +208,7 @@ public class JsonApiManager extends BaseJsonApiManager {
|
|||
}
|
||||
|
||||
protected void processSearchRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
|
||||
final SearchService searchService = ComponentUtil.getComponent(SearchService.class);
|
||||
final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
final RelatedQueryHelper relatedQueryHelper = ComponentUtil.getRelatedQueryHelper();
|
||||
final RelatedContentHelper relatedContentHelper = ComponentUtil.getRelatedContentHelper();
|
||||
|
@ -222,7 +222,7 @@ public class JsonApiManager extends BaseJsonApiManager {
|
|||
final SearchRenderData data = new SearchRenderData();
|
||||
final JsonRequestParams params = new JsonRequestParams(request, fessConfig);
|
||||
query = params.getQuery();
|
||||
searchService.search(params, data, OptionalThing.empty());
|
||||
searchHelper.search(params, data, OptionalThing.empty());
|
||||
final String execTime = data.getExecTime();
|
||||
final String queryTime = Long.toString(data.getQueryTime());
|
||||
final String pageSize = Integer.toString(data.getPageSize());
|
||||
|
@ -523,7 +523,7 @@ public class JsonApiManager extends BaseJsonApiManager {
|
|||
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
final UserInfoHelper userInfoHelper = ComponentUtil.getUserInfoHelper();
|
||||
final SearchService searchService = ComponentUtil.getComponent(SearchService.class);
|
||||
final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
|
||||
final FavoriteLogService favoriteLogService = ComponentUtil.getComponent(FavoriteLogService.class);
|
||||
final SystemHelper systemHelper = ComponentUtil.getSystemHelper();
|
||||
|
||||
|
@ -536,7 +536,7 @@ public class JsonApiManager extends BaseJsonApiManager {
|
|||
throw new WebApiException(6, "No searched urls.");
|
||||
}
|
||||
|
||||
searchService.getDocumentByDocId(docId, new String[] { fessConfig.getIndexFieldUrl() }, OptionalThing.empty())
|
||||
searchHelper.getDocumentByDocId(docId, new String[] { fessConfig.getIndexFieldUrl() }, OptionalThing.empty())
|
||||
.ifPresent(doc -> {
|
||||
final String favoriteUrl = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class);
|
||||
final String userCode = userInfoHelper.getUserCode();
|
||||
|
@ -569,7 +569,7 @@ public class JsonApiManager extends BaseJsonApiManager {
|
|||
}
|
||||
|
||||
final String id = DocumentUtil.getValue(doc, fessConfig.getIndexFieldId(), String.class);
|
||||
searchService.update(id, builder -> {
|
||||
searchHelper.update(id, builder -> {
|
||||
final Script script = new Script("ctx._source." + fessConfig.getIndexFieldFavoriteCount() + "+=1");
|
||||
builder.setScript(script);
|
||||
final Map<String, Object> upsertMap = new HashMap<>();
|
||||
|
@ -607,7 +607,7 @@ public class JsonApiManager extends BaseJsonApiManager {
|
|||
|
||||
final UserInfoHelper userInfoHelper = ComponentUtil.getUserInfoHelper();
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
final SearchService searchService = ComponentUtil.getComponent(SearchService.class);
|
||||
final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
|
||||
final FavoriteLogService favoriteLogService = ComponentUtil.getComponent(FavoriteLogService.class);
|
||||
|
||||
int status = 0;
|
||||
|
@ -626,7 +626,7 @@ public class JsonApiManager extends BaseJsonApiManager {
|
|||
|
||||
final String[] docIds = userInfoHelper.getResultDocIds(queryId);
|
||||
final List<Map<String, Object>> docList =
|
||||
searchService.getDocumentListByDocIds(
|
||||
searchHelper.getDocumentListByDocIds(
|
||||
docIds,
|
||||
new String[] { fessConfig.getIndexFieldUrl(), fessConfig.getIndexFieldDocId(),
|
||||
fessConfig.getIndexFieldFavoriteCount() }, OptionalThing.empty(), SearchRequestType.JSON);
|
||||
|
|
|
@ -32,7 +32,6 @@ import org.apache.commons.lang3.StringUtils;
|
|||
import org.apache.commons.text.StringEscapeUtils;
|
||||
import org.codelibs.core.lang.StringUtil;
|
||||
import org.codelibs.fess.api.BaseJsonApiManager;
|
||||
import org.codelibs.fess.app.service.SearchService;
|
||||
import org.codelibs.fess.entity.FacetInfo;
|
||||
import org.codelibs.fess.entity.GeoInfo;
|
||||
import org.codelibs.fess.entity.HighlightInfo;
|
||||
|
@ -40,6 +39,7 @@ import org.codelibs.fess.entity.SearchRequestParams;
|
|||
import org.codelibs.fess.entity.SearchRequestParams.SearchRequestType;
|
||||
import org.codelibs.fess.exception.InvalidAccessTokenException;
|
||||
import org.codelibs.fess.helper.RoleQueryHelper;
|
||||
import org.codelibs.fess.helper.SearchHelper;
|
||||
import org.codelibs.fess.helper.SuggestHelper;
|
||||
import org.codelibs.fess.mylasta.direction.FessConfig;
|
||||
import org.codelibs.fess.suggest.entity.SuggestItem;
|
||||
|
@ -83,11 +83,11 @@ public class SuggestApiManager extends BaseJsonApiManager {
|
|||
String errMsg = StringUtil.EMPTY;
|
||||
final StringBuilder buf = new StringBuilder(255); // TODO replace response stream
|
||||
final RoleQueryHelper roleQueryHelper = ComponentUtil.getRoleQueryHelper();
|
||||
final SearchService searchService = ComponentUtil.getComponent(SearchService.class);
|
||||
final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
|
||||
|
||||
try {
|
||||
final RequestParameter parameter = RequestParameter.parse(request);
|
||||
final String[] langs = searchService.getLanguages(request, parameter);
|
||||
final String[] langs = searchHelper.getLanguages(request, parameter);
|
||||
|
||||
final SuggestHelper suggestHelper = ComponentUtil.getSuggestHelper();
|
||||
final SuggestRequestBuilder builder = suggestHelper.suggester().suggest();
|
||||
|
|
|
@ -26,7 +26,6 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import org.codelibs.core.lang.StringUtil;
|
||||
import org.codelibs.core.net.URLUtil;
|
||||
import org.codelibs.fess.Constants;
|
||||
import org.codelibs.fess.app.service.SearchService;
|
||||
import org.codelibs.fess.app.web.CrudMode;
|
||||
import org.codelibs.fess.app.web.base.FessAdminAction;
|
||||
import org.codelibs.fess.entity.SearchRenderData;
|
||||
|
@ -34,6 +33,7 @@ import org.codelibs.fess.es.client.FessEsClient;
|
|||
import org.codelibs.fess.exception.InvalidQueryException;
|
||||
import org.codelibs.fess.exception.ResultOffsetExceededException;
|
||||
import org.codelibs.fess.helper.QueryHelper;
|
||||
import org.codelibs.fess.helper.SearchHelper;
|
||||
import org.codelibs.fess.helper.SystemHelper;
|
||||
import org.codelibs.fess.mylasta.action.FessMessages;
|
||||
import org.codelibs.fess.mylasta.direction.FessConfig;
|
||||
|
@ -72,7 +72,7 @@ public class AdminSearchlistAction extends FessAdminAction {
|
|||
protected QueryHelper queryHelper;
|
||||
|
||||
@Resource
|
||||
protected SearchService searchService;
|
||||
protected SearchHelper searchHelper;
|
||||
|
||||
@Resource
|
||||
protected HttpServletRequest request;
|
||||
|
@ -130,7 +130,7 @@ public class AdminSearchlistAction extends FessAdminAction {
|
|||
form.initialize();
|
||||
request.setAttribute(Constants.SEARCH_LOG_ACCESS_TYPE, Constants.SEARCH_LOG_ACCESS_TYPE_ADMIN);
|
||||
try {
|
||||
searchService.search(form, renderData, getUserBean());
|
||||
searchHelper.search(form, renderData, getUserBean());
|
||||
return asListHtml().renderWith(data -> {
|
||||
renderData.register(data);
|
||||
});
|
||||
|
@ -211,7 +211,7 @@ public class AdminSearchlistAction extends FessAdminAction {
|
|||
validate(form, messages -> {}, () -> asListHtml());
|
||||
verifyToken(() -> asListHtml());
|
||||
try {
|
||||
searchService.deleteByQuery(request, form);
|
||||
searchHelper.deleteByQuery(request, form);
|
||||
saveInfo(messages -> messages.addSuccessDeleteDocFromIndex(GLOBAL));
|
||||
} catch (final InvalidQueryException e) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
|
|
|
@ -24,7 +24,6 @@ import javax.annotation.Resource;
|
|||
|
||||
import org.codelibs.core.lang.StringUtil;
|
||||
import org.codelibs.fess.Constants;
|
||||
import org.codelibs.fess.app.service.SearchService;
|
||||
import org.codelibs.fess.app.web.CrudMode;
|
||||
import org.codelibs.fess.app.web.api.ApiResult;
|
||||
import org.codelibs.fess.app.web.api.ApiResult.ApiDeleteResponse;
|
||||
|
@ -38,6 +37,7 @@ import org.codelibs.fess.entity.SearchRenderData;
|
|||
import org.codelibs.fess.es.client.FessEsClient;
|
||||
import org.codelibs.fess.exception.InvalidQueryException;
|
||||
import org.codelibs.fess.exception.ResultOffsetExceededException;
|
||||
import org.codelibs.fess.helper.SearchHelper;
|
||||
import org.codelibs.fess.util.ComponentUtil;
|
||||
import org.elasticsearch.index.query.QueryBuilder;
|
||||
import org.elasticsearch.index.query.QueryBuilders;
|
||||
|
@ -60,7 +60,7 @@ public class ApiAdminSearchlistAction extends FessApiAdminAction {
|
|||
// Attribute
|
||||
// =========
|
||||
@Resource
|
||||
protected SearchService searchService;
|
||||
protected SearchHelper searchHelper;
|
||||
|
||||
@Resource
|
||||
protected FessEsClient fessEsClient;
|
||||
|
@ -83,7 +83,7 @@ public class ApiAdminSearchlistAction extends FessApiAdminAction {
|
|||
final SearchRenderData renderData = new SearchRenderData();
|
||||
body.initialize();
|
||||
try {
|
||||
searchService.search(body, renderData, getUserBean());
|
||||
searchHelper.search(body, renderData, getUserBean());
|
||||
return asJson(new ApiDocsResponse().renderData(renderData).status(Status.OK).result());
|
||||
} catch (final InvalidQueryException e) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
|
@ -208,7 +208,7 @@ public class ApiAdminSearchlistAction extends FessApiAdminAction {
|
|||
throwValidationErrorApi(messages -> messages.addErrorsInvalidQueryUnknown(GLOBAL));
|
||||
}
|
||||
try {
|
||||
final long count = searchService.deleteByQuery(request, body);
|
||||
final long count = searchHelper.deleteByQuery(request, body);
|
||||
return asJson(new ApiDeleteResponse().count(count).status(Status.OK).result());
|
||||
} catch (final InvalidQueryException e) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
|
|
|
@ -31,7 +31,6 @@ import org.apache.commons.text.StringEscapeUtils;
|
|||
import org.codelibs.core.lang.StringUtil;
|
||||
import org.codelibs.core.net.URLUtil;
|
||||
import org.codelibs.fess.Constants;
|
||||
import org.codelibs.fess.app.service.SearchService;
|
||||
import org.codelibs.fess.app.web.sso.SsoAction;
|
||||
import org.codelibs.fess.entity.SearchRequestParams.SearchRequestType;
|
||||
import org.codelibs.fess.helper.LabelTypeHelper;
|
||||
|
@ -39,6 +38,7 @@ import org.codelibs.fess.helper.OpenSearchHelper;
|
|||
import org.codelibs.fess.helper.PopularWordHelper;
|
||||
import org.codelibs.fess.helper.QueryHelper;
|
||||
import org.codelibs.fess.helper.RoleQueryHelper;
|
||||
import org.codelibs.fess.helper.SearchHelper;
|
||||
import org.codelibs.fess.helper.UserInfoHelper;
|
||||
import org.codelibs.fess.thumbnail.ThumbnailManager;
|
||||
import org.codelibs.fess.util.ComponentUtil;
|
||||
|
@ -54,7 +54,7 @@ public abstract class FessSearchAction extends FessBaseAction {
|
|||
protected static final String LABEL_FIELD = "label";
|
||||
|
||||
@Resource
|
||||
protected SearchService searchService;
|
||||
protected SearchHelper searchHelper;
|
||||
|
||||
@Resource
|
||||
protected ThumbnailManager thumbnailManager;
|
||||
|
|
|
@ -54,7 +54,7 @@ public class CacheAction extends FessSearchAction {
|
|||
|
||||
Map<String, Object> doc = null;
|
||||
try {
|
||||
doc = searchService.getDocumentByDocId(form.docId, queryHelper.getCacheResponseFields(), getUserBean()).orElse(null);
|
||||
doc = searchHelper.getDocumentByDocId(form.docId, queryHelper.getCacheResponseFields(), getUserBean()).orElse(null);
|
||||
} catch (final Exception e) {
|
||||
logger.warn("Failed to request: " + form.docId, e);
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ public class GoAction extends FessSearchAction {
|
|||
Map<String, Object> doc = null;
|
||||
try {
|
||||
doc =
|
||||
searchService.getDocumentByDocId(form.docId,
|
||||
searchHelper.getDocumentByDocId(form.docId,
|
||||
new String[] { fessConfig.getIndexFieldUrl(), fessConfig.getIndexFieldConfigId() }, getUserBean()).orElse(null);
|
||||
} catch (final Exception e) {
|
||||
logger.warn("Failed to request: " + form.docId, e);
|
||||
|
|
|
@ -148,9 +148,9 @@ public class SearchAction extends FessSearchAction {
|
|||
|
||||
try {
|
||||
buildFormParams(form);
|
||||
form.lang = searchService.getLanguages(request, form);
|
||||
form.lang = searchHelper.getLanguages(request, form);
|
||||
final WebRenderData renderData = new WebRenderData();
|
||||
searchService.search(form, renderData, getUserBean());
|
||||
searchHelper.search(form, renderData, getUserBean());
|
||||
return asHtml(virtualHost(path_SearchJsp)).renderWith(
|
||||
data -> {
|
||||
if (form.hasConditionQuery()) {
|
||||
|
|
|
@ -52,7 +52,7 @@ public class ThumbnailAction extends FessSearchAction {
|
|||
}
|
||||
|
||||
final Map<String, Object> doc =
|
||||
searchService.getDocumentByDocId(form.docId, queryHelper.getResponseFields(), getUserBean()).orElse(null);
|
||||
searchHelper.getDocumentByDocId(form.docId, queryHelper.getResponseFields(), getUserBean()).orElse(null);
|
||||
final String url = DocumentUtil.getValue(doc, fessConfig.getIndexFieldThumbnail(), String.class);
|
||||
if (StringUtil.isBlank(form.queryId) || StringUtil.isBlank(url) || !thumbnailSupport) {
|
||||
// 404
|
||||
|
|
|
@ -212,4 +212,15 @@ public class SearchRenderData {
|
|||
return queryId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SearchRenderData [documentItems=" + documentItems + ", facetResponse=" + facetResponse + ", appendHighlightParams="
|
||||
+ appendHighlightParams + ", execTime=" + execTime + ", pageSize=" + pageSize + ", currentPageNumber=" + currentPageNumber
|
||||
+ ", allRecordCount=" + allRecordCount + ", allRecordCountRelation=" + allRecordCountRelation + ", allPageCount="
|
||||
+ allPageCount + ", existNextPage=" + existNextPage + ", existPrevPage=" + existPrevPage + ", currentStartRecordNumber="
|
||||
+ currentStartRecordNumber + ", currentEndRecordNumber=" + currentEndRecordNumber + ", pageNumberList=" + pageNumberList
|
||||
+ ", partialResults=" + partialResults + ", searchQuery=" + searchQuery + ", queryTime=" + queryTime + ", requestedTime="
|
||||
+ requestedTime + ", queryId=" + queryId + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
* either express or implied. See the License for the specific language
|
||||
* governing permissions and limitations under the License.
|
||||
*/
|
||||
package org.codelibs.fess.app.service;
|
||||
package org.codelibs.fess.helper;
|
||||
|
||||
import java.text.NumberFormat;
|
||||
import java.util.Enumeration;
|
||||
|
@ -28,7 +28,6 @@ import java.util.function.Consumer;
|
|||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.codelibs.core.lang.StringUtil;
|
||||
|
@ -37,12 +36,8 @@ import org.codelibs.fess.entity.QueryContext;
|
|||
import org.codelibs.fess.entity.SearchRenderData;
|
||||
import org.codelibs.fess.entity.SearchRequestParams;
|
||||
import org.codelibs.fess.entity.SearchRequestParams.SearchRequestType;
|
||||
import org.codelibs.fess.es.client.FessEsClient;
|
||||
import org.codelibs.fess.es.client.FessEsClient.SearchConditionBuilder;
|
||||
import org.codelibs.fess.es.client.FessEsClientException;
|
||||
import org.codelibs.fess.helper.QueryHelper;
|
||||
import org.codelibs.fess.helper.SystemHelper;
|
||||
import org.codelibs.fess.helper.ViewHelper;
|
||||
import org.codelibs.fess.mylasta.action.FessUserBean;
|
||||
import org.codelibs.fess.mylasta.direction.FessConfig;
|
||||
import org.codelibs.fess.util.ComponentUtil;
|
||||
|
@ -64,36 +59,20 @@ import org.lastaflute.web.util.LaRequestUtil;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class SearchService {
|
||||
public class SearchHelper {
|
||||
|
||||
// ===================================================================================
|
||||
// Constant
|
||||
//
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(SearchService.class);
|
||||
|
||||
// ===================================================================================
|
||||
// Attribute
|
||||
//
|
||||
|
||||
@Resource
|
||||
protected FessEsClient fessEsClient;
|
||||
|
||||
@Resource
|
||||
protected SystemHelper systemHelper;
|
||||
|
||||
@Resource
|
||||
protected FessConfig fessConfig;
|
||||
|
||||
@Resource
|
||||
protected QueryHelper queryHelper;
|
||||
private static final Logger logger = LoggerFactory.getLogger(SearchHelper.class);
|
||||
|
||||
// ===================================================================================
|
||||
// Method
|
||||
// ==============
|
||||
|
||||
public void search(final SearchRequestParams params, final SearchRenderData data, final OptionalThing<FessUserBean> userBean) {
|
||||
final long requestedTime = systemHelper.getCurrentTimeAsLong();
|
||||
final long requestedTime = ComponentUtil.getSystemHelper().getCurrentTimeAsLong();
|
||||
final long startTime = System.currentTimeMillis();
|
||||
|
||||
LaRequestUtil.getOptionalRequest().ifPresent(request -> {
|
||||
|
@ -110,8 +89,11 @@ public class SearchService {
|
|||
} else {
|
||||
query = ComponentUtil.getQueryStringBuilder().params(params).build() + " sort:" + sortField;
|
||||
}
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
final QueryHelper queryHelper = ComponentUtil.getQueryHelper();
|
||||
final List<Map<String, Object>> documentItems =
|
||||
fessEsClient.search(fessConfig.getIndexDocumentSearchIndex(),
|
||||
ComponentUtil.getFessEsClient().search(
|
||||
fessConfig.getIndexDocumentSearchIndex(),
|
||||
searchRequestBuilder -> {
|
||||
queryHelper.processSearchPreference(searchRequestBuilder, userBean, query);
|
||||
return SearchConditionBuilder.builder(searchRequestBuilder).query(query).offset(pageStart).size(pageSize)
|
||||
|
@ -207,9 +189,11 @@ public class SearchService {
|
|||
} else {
|
||||
query = ComponentUtil.getQueryStringBuilder().params(params).build() + " sort:" + sortField;
|
||||
}
|
||||
return fessEsClient.<Map<String, Object>> scrollSearch(
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
return ComponentUtil.getFessEsClient().<Map<String, Object>> scrollSearch(
|
||||
fessConfig.getIndexDocumentSearchIndex(),
|
||||
searchRequestBuilder -> {
|
||||
final QueryHelper queryHelper = ComponentUtil.getQueryHelper();
|
||||
queryHelper.processSearchPreference(searchRequestBuilder, userBean, query);
|
||||
return SearchConditionBuilder.builder(searchRequestBuilder).scroll().query(query).size(pageSize)
|
||||
.responseFields(queryHelper.getScrollResponseFields()).searchRequestType(params.getType()).build();
|
||||
|
@ -247,16 +231,17 @@ public class SearchService {
|
|||
}
|
||||
|
||||
public long deleteByQuery(final HttpServletRequest request, final SearchRequestParams params) {
|
||||
|
||||
final String query = ComponentUtil.getQueryStringBuilder().params(params).build();
|
||||
|
||||
final QueryContext queryContext = queryHelper.build(params.getType(), query, context -> {
|
||||
final QueryContext queryContext = ComponentUtil.getQueryHelper().build(params.getType(), query, context -> {
|
||||
context.skipRoleQuery();
|
||||
});
|
||||
return fessEsClient.deleteByQuery(fessConfig.getIndexDocumentUpdateIndex(), queryContext.getQueryBuilder());
|
||||
return ComponentUtil.getFessEsClient().deleteByQuery(ComponentUtil.getFessConfig().getIndexDocumentUpdateIndex(),
|
||||
queryContext.getQueryBuilder());
|
||||
}
|
||||
|
||||
public String[] getLanguages(final HttpServletRequest request, final SearchRequestParams params) {
|
||||
final SystemHelper systemHelper = ComponentUtil.getSystemHelper();
|
||||
if (params.getLanguages() != null) {
|
||||
final Set<String> langSet = new HashSet<>();
|
||||
for (final String lang : params.getLanguages()) {
|
||||
|
@ -277,7 +262,7 @@ public class SearchService {
|
|||
langSet.remove(Constants.ALL_LANGUAGES);
|
||||
}
|
||||
return langSet.toArray(new String[langSet.size()]);
|
||||
} else if (fessConfig.isBrowserLocaleForSearchUsed()) {
|
||||
} else if (ComponentUtil.getFessConfig().isBrowserLocaleForSearchUsed()) {
|
||||
final Set<String> langSet = new HashSet<>();
|
||||
final Enumeration<Locale> locales = request.getLocales();
|
||||
if (locales != null) {
|
||||
|
@ -298,14 +283,16 @@ public class SearchService {
|
|||
|
||||
public OptionalEntity<Map<String, Object>> getDocumentByDocId(final String docId, final String[] fields,
|
||||
final OptionalThing<FessUserBean> userBean) {
|
||||
return fessEsClient.getDocument(
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
return ComponentUtil.getFessEsClient().getDocument(
|
||||
fessConfig.getIndexDocumentSearchIndex(),
|
||||
builder -> {
|
||||
final BoolQueryBuilder boolQuery =
|
||||
QueryBuilders.boolQuery().must(QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId));
|
||||
final Set<String> roleSet = ComponentUtil.getRoleQueryHelper().build(SearchRequestType.JSON); // TODO SearchRequestType?
|
||||
final QueryHelper queryHelper = ComponentUtil.getQueryHelper();
|
||||
if (!roleSet.isEmpty()) {
|
||||
ComponentUtil.getQueryHelper().buildRoleQuery(roleSet, boolQuery);
|
||||
queryHelper.buildRoleQuery(roleSet, boolQuery);
|
||||
}
|
||||
builder.setQuery(boolQuery);
|
||||
builder.setFetchSource(fields, null);
|
||||
|
@ -317,15 +304,17 @@ public class SearchService {
|
|||
|
||||
public List<Map<String, Object>> getDocumentListByDocIds(final String[] docIds, final String[] fields,
|
||||
final OptionalThing<FessUserBean> userBean, final SearchRequestType searchRequestType) {
|
||||
return fessEsClient.getDocumentList(
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
return ComponentUtil.getFessEsClient().getDocumentList(
|
||||
fessConfig.getIndexDocumentSearchIndex(),
|
||||
builder -> {
|
||||
final BoolQueryBuilder boolQuery =
|
||||
QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(fessConfig.getIndexFieldDocId(), docIds));
|
||||
final QueryHelper queryHelper = ComponentUtil.getQueryHelper();
|
||||
if (searchRequestType != SearchRequestType.ADMIN_SEARCH) {
|
||||
final Set<String> roleSet = ComponentUtil.getRoleQueryHelper().build(searchRequestType);
|
||||
if (!roleSet.isEmpty()) {
|
||||
ComponentUtil.getQueryHelper().buildRoleQuery(roleSet, boolQuery);
|
||||
queryHelper.buildRoleQuery(roleSet, boolQuery);
|
||||
}
|
||||
}
|
||||
builder.setQuery(boolQuery);
|
||||
|
@ -337,12 +326,14 @@ public class SearchService {
|
|||
}
|
||||
|
||||
public boolean update(final String id, final String field, final Object value) {
|
||||
return fessEsClient.update(fessConfig.getIndexDocumentUpdateIndex(), id, field, value);
|
||||
return ComponentUtil.getFessEsClient().update(ComponentUtil.getFessConfig().getIndexDocumentUpdateIndex(), id, field, value);
|
||||
}
|
||||
|
||||
public boolean update(final String id, final Consumer<UpdateRequestBuilder> builderLambda) {
|
||||
try {
|
||||
final UpdateRequestBuilder builder = fessEsClient.prepareUpdate().setIndex(fessConfig.getIndexDocumentUpdateIndex()).setId(id);
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
final UpdateRequestBuilder builder =
|
||||
ComponentUtil.getFessEsClient().prepareUpdate().setIndex(fessConfig.getIndexDocumentUpdateIndex()).setId(id);
|
||||
builderLambda.accept(builder);
|
||||
final UpdateResponse response = builder.execute().actionGet(fessConfig.getIndexIndexTimeout());
|
||||
return response.getResult() == Result.CREATED || response.getResult() == Result.UPDATED;
|
||||
|
@ -352,7 +343,7 @@ public class SearchService {
|
|||
}
|
||||
|
||||
public boolean bulkUpdate(final Consumer<BulkRequestBuilder> consumer) {
|
||||
final BulkRequestBuilder builder = fessEsClient.prepareBulk();
|
||||
final BulkRequestBuilder builder = ComponentUtil.getFessEsClient().prepareBulk();
|
||||
consumer.accept(builder);
|
||||
try {
|
||||
final BulkResponse response = builder.execute().get();
|
|
@ -35,7 +35,6 @@ import org.apache.commons.lang3.StringUtils;
|
|||
import org.codelibs.core.concurrent.CommonPoolUtil;
|
||||
import org.codelibs.core.lang.StringUtil;
|
||||
import org.codelibs.fess.Constants;
|
||||
import org.codelibs.fess.app.service.SearchService;
|
||||
import org.codelibs.fess.entity.SearchRequestParams;
|
||||
import org.codelibs.fess.entity.SearchRequestParams.SearchRequestType;
|
||||
import org.codelibs.fess.es.log.exbhv.ClickLogBhv;
|
||||
|
@ -345,11 +344,11 @@ public class SearchLogHelper {
|
|||
}
|
||||
|
||||
if (!clickCountMap.isEmpty()) {
|
||||
final SearchService searchService = ComponentUtil.getComponent(SearchService.class);
|
||||
final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
|
||||
try {
|
||||
searchService.bulkUpdate(builder -> {
|
||||
searchHelper.bulkUpdate(builder -> {
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
searchService.getDocumentListByDocIds(clickCountMap.keySet().toArray(new String[clickCountMap.size()]),
|
||||
searchHelper.getDocumentListByDocIds(clickCountMap.keySet().toArray(new String[clickCountMap.size()]),
|
||||
new String[] { fessConfig.getIndexFieldDocId() }, OptionalThing.of(FessUserBean.empty()),
|
||||
SearchRequestType.ADMIN_SEARCH).forEach(
|
||||
doc -> {
|
||||
|
|
|
@ -33,6 +33,8 @@ import java.util.Locale;
|
|||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Matcher;
|
||||
|
@ -52,7 +54,10 @@ import org.codelibs.core.CoreLibConstants;
|
|||
import org.codelibs.core.io.CloseableUtil;
|
||||
import org.codelibs.core.lang.StringUtil;
|
||||
import org.codelibs.core.misc.DynamicProperties;
|
||||
import org.codelibs.core.stream.StreamUtil;
|
||||
import org.codelibs.fess.Constants;
|
||||
import org.codelibs.fess.app.web.base.SearchForm;
|
||||
import org.codelibs.fess.app.web.base.login.FessLoginAssist;
|
||||
import org.codelibs.fess.crawler.builder.RequestDataBuilder;
|
||||
import org.codelibs.fess.crawler.client.CrawlerClient;
|
||||
import org.codelibs.fess.crawler.client.CrawlerClientFactory;
|
||||
|
@ -60,12 +65,15 @@ import org.codelibs.fess.crawler.entity.ResponseData;
|
|||
import org.codelibs.fess.crawler.util.CharUtil;
|
||||
import org.codelibs.fess.entity.FacetQueryView;
|
||||
import org.codelibs.fess.entity.HighlightInfo;
|
||||
import org.codelibs.fess.entity.SearchRenderData;
|
||||
import org.codelibs.fess.es.config.exentity.CrawlingConfig;
|
||||
import org.codelibs.fess.exception.FessSystemException;
|
||||
import org.codelibs.fess.helper.UserAgentHelper.UserAgentType;
|
||||
import org.codelibs.fess.mylasta.action.FessUserBean;
|
||||
import org.codelibs.fess.mylasta.direction.FessConfig;
|
||||
import org.codelibs.fess.util.ComponentUtil;
|
||||
import org.codelibs.fess.util.DocumentUtil;
|
||||
import org.codelibs.fess.util.FacetResponse;
|
||||
import org.codelibs.fess.util.ResourceUtil;
|
||||
import org.dbflute.optional.OptionalThing;
|
||||
import org.lastaflute.taglib.function.LaFunctions;
|
||||
|
@ -82,6 +90,8 @@ import com.github.jknack.handlebars.Context;
|
|||
import com.github.jknack.handlebars.Handlebars;
|
||||
import com.github.jknack.handlebars.Template;
|
||||
import com.github.jknack.handlebars.io.FileTemplateLoader;
|
||||
import com.google.common.cache.Cache;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.ibm.icu.text.SimpleDateFormat;
|
||||
|
||||
public class ViewHelper {
|
||||
|
@ -140,6 +150,10 @@ public class ViewHelper {
|
|||
|
||||
protected final Set<String> inlineMimeTypeSet = new HashSet<>();
|
||||
|
||||
protected Cache<String, FacetResponse> facetCache;
|
||||
|
||||
protected long facetCacheDuration = 60 * 10; // 10min
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
if (logger.isDebugEnabled()) {
|
||||
|
@ -181,6 +195,8 @@ public class ViewHelper {
|
|||
logger.debug("loaded {}", facetQueryView);
|
||||
}
|
||||
}));
|
||||
|
||||
facetCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(facetCacheDuration, TimeUnit.SECONDS).build();
|
||||
}
|
||||
|
||||
public String getContentTitle(final Map<String, Object> document) {
|
||||
|
@ -728,6 +744,40 @@ public class ViewHelper {
|
|||
}
|
||||
}
|
||||
|
||||
public FacetResponse getCachedFacetResponse(final String query) {
|
||||
final OptionalThing<FessUserBean> userBean = ComponentUtil.getComponent(FessLoginAssist.class).getSavedUserBean();
|
||||
final String permissionKey =
|
||||
userBean.map(
|
||||
user -> StreamUtil.stream(user.getPermissions()).get(
|
||||
stream -> stream.sorted().distinct().collect(Collectors.joining("\n")))).orElse(StringUtil.EMPTY);
|
||||
|
||||
try {
|
||||
return facetCache.get(query + "\n" + permissionKey, () -> {
|
||||
final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
|
||||
final SearchForm params = new SearchForm() {
|
||||
@Override
|
||||
public int getPageSize() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getStartPosition() {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
params.q = query;
|
||||
final SearchRenderData data = new SearchRenderData();
|
||||
searchHelper.search(params, data, userBean);
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("loaded facet data: {}", data);
|
||||
}
|
||||
return data.getFacetResponse();
|
||||
});
|
||||
} catch (ExecutionException e) {
|
||||
throw new FessSystemException("Cannot load facet from cache.", e);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isUseSession() {
|
||||
return useSession;
|
||||
}
|
||||
|
@ -814,4 +864,8 @@ public class ViewHelper {
|
|||
public void setCacheTemplateName(final String cacheTemplateName) {
|
||||
this.cacheTemplateName = cacheTemplateName;
|
||||
}
|
||||
|
||||
public void setFacetCacheDuration(final long facetCacheDuration) {
|
||||
this.facetCacheDuration = facetCacheDuration;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,6 +58,7 @@ import org.codelibs.fess.helper.RelatedContentHelper;
|
|||
import org.codelibs.fess.helper.RelatedQueryHelper;
|
||||
import org.codelibs.fess.helper.RoleQueryHelper;
|
||||
import org.codelibs.fess.helper.SambaHelper;
|
||||
import org.codelibs.fess.helper.SearchHelper;
|
||||
import org.codelibs.fess.helper.SearchLogHelper;
|
||||
import org.codelibs.fess.helper.SuggestHelper;
|
||||
import org.codelibs.fess.helper.SystemHelper;
|
||||
|
@ -91,6 +92,8 @@ public final class ComponentUtil {
|
|||
|
||||
private static Map<String, Object> componentMap = new HashMap<>();
|
||||
|
||||
private static final String SEARCH_HELPER = "searchHelper";
|
||||
|
||||
private static final String THEME_HELPER = "themeHelper";
|
||||
|
||||
private static final String PLUGIN_HELPER = "pluginHelper";
|
||||
|
@ -455,6 +458,10 @@ public final class ComponentUtil {
|
|||
return getComponent(THEME_HELPER);
|
||||
}
|
||||
|
||||
public static SearchHelper getSearchHelper() {
|
||||
return getComponent(SEARCH_HELPER);
|
||||
}
|
||||
|
||||
public static <T> T getComponent(final Class<T> clazz) {
|
||||
try {
|
||||
return SingletonLaContainer.getComponent(clazz);
|
||||
|
|
|
@ -141,7 +141,9 @@ public class QueryResponseList implements List<Map<String, Object>> {
|
|||
|
||||
});
|
||||
|
||||
calculatePageInfo(start, pageSize);
|
||||
if (pageSize > 0) {
|
||||
calculatePageInfo(start, pageSize);
|
||||
}
|
||||
}
|
||||
|
||||
protected Map<String, Object> parseSearchHit(final FessConfig fessConfig, final String hlPrefix, final SearchHit searchHit) {
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
</component>
|
||||
<component name="pluginHelper" class="org.codelibs.fess.helper.PluginHelper">
|
||||
</component>
|
||||
<component name="searchHelper" class="org.codelibs.fess.helper.SearchHelper">
|
||||
</component>
|
||||
<component name="themeHelper" class="org.codelibs.fess.helper.ThemeHelper">
|
||||
</component>
|
||||
<component name="queryStringBuilder" class="org.codelibs.fess.util.QueryStringBuilder" instance="prototype">
|
||||
|
|
Loading…
Add table
Reference in a new issue