diff --git a/src/main/java/org/codelibs/fess/app/service/SearchService.java b/src/main/java/org/codelibs/fess/app/service/SearchService.java index b6850774e..d80020bb6 100644 --- a/src/main/java/org/codelibs/fess/app/service/SearchService.java +++ b/src/main/java/org/codelibs/fess/app/service/SearchService.java @@ -33,6 +33,7 @@ import org.codelibs.fess.Constants; 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; @@ -52,6 +53,7 @@ import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.update.UpdateRequestBuilder; import org.elasticsearch.action.update.UpdateResponse; +import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.lastaflute.taglib.function.LaFunctions; @@ -215,22 +217,41 @@ public class SearchService { public OptionalEntity> getDocumentByDocId(final String docId, final String[] fields, final OptionalThing userBean) { return fessEsClient.getDocument(fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), builder -> { - builder.setQuery(QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId)); - builder.setFetchSource(fields, null); - fessConfig.processSearchPreference(builder, userBean); - return true; - }); + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().must(QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId)); + final Set roleSet = ComponentUtil.getRoleQueryHelper().build(SearchRequestType.JSON); // TODO SearchRequestType? + if (!roleSet.isEmpty()) { + final BoolQueryBuilder roleQuery = QueryBuilders.boolQuery(); + roleSet.stream().forEach(name -> { + roleQuery.should(QueryBuilders.termQuery(fessConfig.getIndexFieldRole(), name)); + }); + boolQuery.filter(roleQuery); + } + builder.setQuery(boolQuery); + builder.setFetchSource(fields, null); + fessConfig.processSearchPreference(builder, userBean); + return true; + }); + } public List> getDocumentListByDocIds(final String[] docIds, final String[] fields, final OptionalThing userBean) { return fessEsClient.getDocumentList(fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), builder -> { - builder.setQuery(QueryBuilders.termsQuery(fessConfig.getIndexFieldDocId(), docIds)); - builder.setSize(fessConfig.getPagingSearchPageMaxSizeAsInteger().intValue()); - builder.setFetchSource(fields, null); - fessConfig.processSearchPreference(builder, userBean); - return true; - }); + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(fessConfig.getIndexFieldDocId(), docIds)); + final Set roleSet = ComponentUtil.getRoleQueryHelper().build(SearchRequestType.JSON); // TODO SearchRequestType? + if (!roleSet.isEmpty()) { + final BoolQueryBuilder roleQuery = QueryBuilders.boolQuery(); + roleSet.stream().forEach(name -> { + roleQuery.should(QueryBuilders.termQuery(fessConfig.getIndexFieldRole(), name)); + }); + boolQuery.filter(roleQuery); + } + builder.setQuery(boolQuery); + builder.setSize(fessConfig.getPagingSearchPageMaxSizeAsInteger().intValue()); + builder.setFetchSource(fields, null); + fessConfig.processSearchPreference(builder, userBean); + return true; + }); } public boolean update(final String id, final String field, final Object value) { diff --git a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java index 29ba14e6f..459c44cbc 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java @@ -429,8 +429,10 @@ public class AdminSearchlistAction extends FessAdminAction { case CrudMode.EDIT: if (form instanceof EditForm) { final String docId = ((EditForm) form).docId; - final QueryBuilder query = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId); - return fessEsClient.getDocumentByQuery(fessConfig.getIndexDocumentUpdateIndex(), fessConfig.getIndexDocumentType(), query); + return fessEsClient.getDocument(fessConfig.getIndexDocumentUpdateIndex(), fessConfig.getIndexDocumentType(), builder -> { + builder.setQuery(QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId)); + return true; + }); } break; default: diff --git a/src/main/java/org/codelibs/fess/app/web/base/FessSearchAction.java b/src/main/java/org/codelibs/fess/app/web/base/FessSearchAction.java index 49369cf65..6f49786bd 100644 --- a/src/main/java/org/codelibs/fess/app/web/base/FessSearchAction.java +++ b/src/main/java/org/codelibs/fess/app/web/base/FessSearchAction.java @@ -29,9 +29,9 @@ import org.apache.commons.lang3.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.es.client.FessEsClient; import org.codelibs.fess.helper.LabelTypeHelper; import org.codelibs.fess.helper.OpenSearchHelper; import org.codelibs.fess.helper.PopularWordHelper; @@ -53,7 +53,7 @@ public abstract class FessSearchAction extends FessBaseAction { protected static final String LABEL_FIELD = "label"; @Resource - protected FessEsClient fessEsClient; + protected SearchService searchService; @Resource protected ThumbnailManager thumbnailManager; diff --git a/src/main/java/org/codelibs/fess/app/web/cache/CacheAction.java b/src/main/java/org/codelibs/fess/app/web/cache/CacheAction.java index 7b2a6e1a9..57b93410b 100644 --- a/src/main/java/org/codelibs/fess/app/web/cache/CacheAction.java +++ b/src/main/java/org/codelibs/fess/app/web/cache/CacheAction.java @@ -21,8 +21,6 @@ import org.codelibs.fess.Constants; import org.codelibs.fess.app.web.base.FessSearchAction; import org.codelibs.fess.app.web.error.ErrorAction; import org.codelibs.fess.util.DocumentUtil; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.TermQueryBuilder; import org.lastaflute.web.Execute; import org.lastaflute.web.response.ActionResponse; import org.lastaflute.web.response.StreamResponse; @@ -56,15 +54,7 @@ public class CacheAction extends FessSearchAction { Map doc = null; try { - doc = - fessEsClient.getDocument(fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), - queryRequestBuilder -> { - final TermQueryBuilder termQuery = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), form.docId); - queryRequestBuilder.setQuery(termQuery); - queryRequestBuilder.setFetchSource(queryHelper.getCacheResponseFields(), null); - fessConfig.processSearchPreference(queryRequestBuilder, getUserBean()); - return true; - }).orElse(null); + doc = searchService.getDocumentByDocId(form.docId, queryHelper.getCacheResponseFields(), getUserBean()).orElse(null); } catch (final Exception e) { logger.warn("Failed to request: " + form.docId, e); } diff --git a/src/main/java/org/codelibs/fess/app/web/go/GoAction.java b/src/main/java/org/codelibs/fess/app/web/go/GoAction.java index 20b48d26c..e13b3bf64 100644 --- a/src/main/java/org/codelibs/fess/app/web/go/GoAction.java +++ b/src/main/java/org/codelibs/fess/app/web/go/GoAction.java @@ -36,8 +36,6 @@ import org.codelibs.fess.helper.ViewHelper; import org.codelibs.fess.util.ComponentUtil; import org.codelibs.fess.util.DocumentUtil; import org.dbflute.util.DfTypeUtil; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.TermQueryBuilder; import org.lastaflute.web.Execute; import org.lastaflute.web.response.ActionResponse; import org.lastaflute.web.response.HtmlResponse; @@ -77,17 +75,8 @@ public class GoAction extends FessSearchAction { Map doc = null; try { doc = - fessEsClient.getDocument( - fessConfig.getIndexDocumentSearchIndex(), - fessConfig.getIndexDocumentType(), - queryRequestBuilder -> { - final TermQueryBuilder termQuery = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), form.docId); - queryRequestBuilder.setQuery(termQuery); - queryRequestBuilder.setFetchSource( - new String[] { fessConfig.getIndexFieldUrl(), fessConfig.getIndexFieldConfigId() }, null); - fessConfig.processSearchPreference(queryRequestBuilder, getUserBean()); - return true; - }).orElse(null); + 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); } diff --git a/src/main/java/org/codelibs/fess/app/web/thumbnail/ThumbnailAction.java b/src/main/java/org/codelibs/fess/app/web/thumbnail/ThumbnailAction.java index ab855e544..1ecba8c7d 100644 --- a/src/main/java/org/codelibs/fess/app/web/thumbnail/ThumbnailAction.java +++ b/src/main/java/org/codelibs/fess/app/web/thumbnail/ThumbnailAction.java @@ -26,8 +26,6 @@ import javax.servlet.http.HttpServletResponse; import org.codelibs.core.lang.StringUtil; import org.codelibs.fess.app.web.base.FessSearchAction; import org.codelibs.fess.util.DocumentUtil; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.TermQueryBuilder; import org.lastaflute.web.Execute; import org.lastaflute.web.response.ActionResponse; @@ -54,14 +52,7 @@ public class ThumbnailAction extends FessSearchAction { } final Map doc = - fessEsClient.getDocument(fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), - queryRequestBuilder -> { - final TermQueryBuilder termQuery = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), form.docId); - queryRequestBuilder.setQuery(termQuery); - queryRequestBuilder.setFetchSource(queryHelper.getResponseFields(), null); - fessConfig.processSearchPreference(queryRequestBuilder, getUserBean()); - return true; - }).orElse(null); + searchService.getDocumentByDocId(form.docId, queryHelper.getResponseFields(), getUserBean()).orElse(null); final String url = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class); if (StringUtil.isBlank(form.queryId) || StringUtil.isBlank(url) || !thumbnailSupport) { // 404 diff --git a/src/main/java/org/codelibs/fess/es/client/FessEsClient.java b/src/main/java/org/codelibs/fess/es/client/FessEsClient.java index a76bf7a1e..d15cef824 100644 --- a/src/main/java/org/codelibs/fess/es/client/FessEsClient.java +++ b/src/main/java/org/codelibs/fess/es/client/FessEsClient.java @@ -135,7 +135,6 @@ import org.elasticsearch.common.settings.Settings.Builder; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.index.get.GetField; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHitField; @@ -573,7 +572,7 @@ public class FessEsClient implements Client { return count; } - public T get(final String index, final String type, final String id, final SearchCondition condition, + protected T get(final String index, final String type, final String id, final SearchCondition condition, final SearchResult searchResult) { final long startTime = System.currentTimeMillis(); @@ -603,6 +602,9 @@ public class FessEsClient implements Client { } try { + if (logger.isDebugEnabled()) { + logger.debug("Query DSL:\n" + searchRequestBuilder.toString()); + } searchResponse = searchRequestBuilder.execute().actionGet(ComponentUtil.getFessConfig().getIndexSearchTimeout()); } catch (final SearchPhaseExecutionException e) { throw new InvalidQueryException(messages -> messages.addErrorsInvalidQueryParseError(UserMessages.GLOBAL_PROPERTY_KEY), @@ -626,6 +628,7 @@ public class FessEsClient implements Client { if (source != null) { final Map docMap = new HashMap<>(source); docMap.put(fessConfig.getIndexFieldId(), hit.getId()); + docMap.put(fessConfig.getIndexFieldVersion(), hit.getVersion()); return docMap; } final Map fields = hit.getFields(); @@ -634,15 +637,19 @@ public class FessEsClient implements Client { fields.entrySet().stream() .collect(Collectors.toMap(e -> e.getKey(), e -> (Object) e.getValue().getValues())); docMap.put(fessConfig.getIndexFieldId(), hit.getId()); + docMap.put(fessConfig.getIndexFieldVersion(), hit.getVersion()); return docMap; } return null; }); } - public OptionalEntity getDocument(final String index, final String type, final SearchCondition condition, - final EntityCreator creator) { - return search(index, type, condition, (queryBuilder, execTime, searchResponse) -> { + protected OptionalEntity getDocument(final String index, final String type, + final SearchCondition condition, final EntityCreator creator) { + return search(index, type, searchRequestBuilder -> { + searchRequestBuilder.setVersion(true); + return condition.build(searchRequestBuilder); + }, (queryBuilder, execTime, searchResponse) -> { return searchResponse.map(response -> { final SearchHit[] hits = response.getHits().hits(); if (hits.length > 0) { @@ -653,65 +660,6 @@ public class FessEsClient implements Client { }); } - public OptionalEntity> getDocument(final String index, final String type, final String id, - final SearchCondition condition) { - return getDocument( - index, - type, - id, - condition, - (response, result) -> { - final FessConfig fessConfig = ComponentUtil.getFessConfig(); - final Map source = response.getSource(); - if (source != null) { - final Map docMap = new HashMap<>(source); - docMap.put(fessConfig.getIndexFieldId(), response.getId()); - return docMap; - } - final Map fields = response.getFields(); - if (fields != null) { - final Map docMap = - fields.entrySet().stream() - .collect(Collectors.toMap(e -> e.getKey(), e -> (Object) e.getValue().getValues())); - docMap.put(fessConfig.getIndexFieldId(), response.getId()); - return docMap; - } - return null; - - }); - } - - public OptionalEntity getDocument(final String index, final String type, final String id, - final SearchCondition condition, final EntityCreator creator) { - return get(index, type, id, condition, (queryBuilder, execTime, getResponse) -> { - return getResponse.map(response -> { - return creator.build(response, response); - }); - }); - } - - public OptionalEntity> getDocumentByQuery(final String index, final String type, final QueryBuilder queryBuilder) { - - final FessConfig fessConfig = ComponentUtil.getFessConfig(); - final SearchResponse response = - client.prepareSearch(index).setTypes(type).setSize(1).setQuery(queryBuilder) - .setFetchSource(new String[] { fessConfig.getIndexFieldId() }, null) - .setPreference(Constants.SEARCH_PREFERENCE_PRIMARY).execute().actionGet(fessConfig.getIndexSearchTimeout()); - final SearchHits hits = response.getHits(); - if (hits.getTotalHits() != 0) { - final SearchHit hit = hits.getAt(0); - final String id = hit.getId(); - final GetResponse getResponse = - client.prepareGet(index, type, id).setPreference(Constants.SEARCH_PREFERENCE_PRIMARY).execute() - .actionGet(fessConfig.getIndexSearchTimeout()); - final Map source = BeanUtil.copyMapToNewMap(getResponse.getSource()); - source.put(fessConfig.getIndexFieldId(), id); - source.put(fessConfig.getIndexFieldVersion(), getResponse.getVersion()); - return OptionalEntity.of(source); - } - return OptionalEntity.empty(); - } - public List> getDocumentList(final String index, final String type, final SearchCondition condition) { return getDocumentList( @@ -738,7 +686,7 @@ public class FessEsClient implements Client { }); } - public List getDocumentList(final String index, final String type, final SearchCondition condition, + protected List getDocumentList(final String index, final String type, final SearchCondition condition, final EntityCreator creator) { return search(index, type, condition, (searchRequestBuilder, execTime, searchResponse) -> { final List list = new ArrayList<>(); @@ -823,7 +771,6 @@ public class FessEsClient implements Client { for (int i = 0; i < requests.size(); i++) { final BulkItemResponse resp = items[i]; if (resp.isFailed() && resp.getFailure() != null) { - @SuppressWarnings("rawtypes") final ActionRequest req = requests.get(i); final Failure failure = resp.getFailure(); logger.debug("Failed Request: " + req + "\n=>" + failure.getMessage()); @@ -967,10 +914,6 @@ public class FessEsClient implements Client { } searchRequestBuilder.setQuery(queryContext.getQueryBuilder()); - if (logger.isDebugEnabled()) { - logger.debug("Query: " + searchRequestBuilder); - } - return true; } } diff --git a/src/main/java/org/codelibs/fess/helper/IndexingHelper.java b/src/main/java/org/codelibs/fess/helper/IndexingHelper.java index 767b60639..d3dceb0df 100644 --- a/src/main/java/org/codelibs/fess/helper/IndexingHelper.java +++ b/src/main/java/org/codelibs/fess/helper/IndexingHelper.java @@ -135,10 +135,11 @@ public class IndexingHelper { public Map getDocument(final FessEsClient fessEsClient, final String id, final String[] fields) { final FessConfig fessConfig = ComponentUtil.getFessConfig(); - return fessEsClient.getDocument(fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), id, - requestBuilder -> { - return true; - }).orElse(null); + return fessEsClient.getDocument(fessConfig.getIndexDocumentUpdateIndex(), fessConfig.getIndexDocumentType(), builder -> { + builder.setQuery(QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), id)); + builder.setFetchSource(fields, null); + return true; + }).orElse(null); } public List> getDocumentListByPrefixId(final FessEsClient fessEsClient, final String id, final String[] fields) { @@ -164,12 +165,12 @@ public class IndexingHelper { final FessConfig fessConfig = ComponentUtil.getFessConfig(); final SearchResponse countResponse = - fessEsClient.prepareSearch(fessConfig.getIndexDocumentSearchIndex()).setTypes(fessConfig.getIndexDocumentType()) + fessEsClient.prepareSearch(fessConfig.getIndexDocumentUpdateIndex()).setTypes(fessConfig.getIndexDocumentType()) .setQuery(queryBuilder).setSize(0).execute().actionGet(fessConfig.getIndexSearchTimeout()); final long numFound = countResponse.getHits().getTotalHits(); // TODO max threshold - return fessEsClient.getDocumentList(fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), + return fessEsClient.getDocumentList(fessConfig.getIndexDocumentUpdateIndex(), fessConfig.getIndexDocumentType(), requestBuilder -> { requestBuilder.setQuery(queryBuilder).setSize((int) numFound); if (fields != null) {