fix #2283 add getCachedFacetResponse

This commit is contained in:
Shinsuke Sugaya 2019-10-22 22:06:54 +09:00
parent 458490d00a
commit 40e226364d
17 changed files with 140 additions and 74 deletions

View file

@ -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();

View file

@ -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);

View file

@ -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();

View file

@ -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()) {

View file

@ -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()) {

View file

@ -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;

View file

@ -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);
}

View file

@ -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);

View file

@ -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()) {

View file

@ -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

View file

@ -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 + "]";
}
}

View file

@ -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();

View file

@ -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 -> {

View file

@ -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;
}
}

View file

@ -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);

View file

@ -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) {

View file

@ -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">