diff --git a/src/main/java/org/codelibs/fess/Constants.java b/src/main/java/org/codelibs/fess/Constants.java index c873b30ba..913a59ae5 100644 --- a/src/main/java/org/codelibs/fess/Constants.java +++ b/src/main/java/org/codelibs/fess/Constants.java @@ -296,6 +296,8 @@ public class Constants extends CoreLibConstants { public static final String FACET_QUERY_PREFIX = "query:"; + public static final String MATCHES_ALL_QUERY = "*:*"; + public static final String FESS_ES_TRANSPORT_ADDRESSES = "fess.es.transport_addresses"; public static final String FESS_ES_CLUSTER_NAME = "fess.es.cluster_name"; 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 c1db2a73a..83d4c55a7 100644 --- a/src/main/java/org/codelibs/fess/app/service/SearchService.java +++ b/src/main/java/org/codelibs/fess/app/service/SearchService.java @@ -36,6 +36,7 @@ import org.codelibs.core.lang.StringUtil; import org.codelibs.core.misc.DynamicProperties; import org.codelibs.fess.Constants; import org.codelibs.fess.app.web.base.login.FessLoginAssist; +import org.codelibs.fess.entity.QueryContext; import org.codelibs.fess.entity.SearchRenderData; import org.codelibs.fess.entity.SearchRequestParams; import org.codelibs.fess.es.client.FessEsClient; @@ -195,6 +196,41 @@ public class SearchService { } } + public int deleteByQuery(final HttpServletRequest request, final SearchRequestParams params) { + if (StringUtil.isNotBlank(params.getOperator())) { + request.setAttribute(Constants.DEFAULT_OPERATOR, params.getOperator()); + } + + final StringBuilder queryBuf = new StringBuilder(255); + if (StringUtil.isNotBlank(params.getQuery())) { + if (params.getQuery().indexOf(" OR ") >= 0) { + queryBuf.append('(').append(params.getQuery()).append(')'); + } else { + queryBuf.append(params.getQuery()); + } + } + if (params.getAdditional() != null) { + appendAdditionalQuery(params.getAdditional(), additional -> { + queryBuf.append(' ').append(additional); + }); + } + params.getFields().entrySet().stream().forEach(entry -> { + appendQueries(queryBuf, entry.getKey(), entry.getValue()); + }); + + if (params.getLanguages() != null) { + appendQueries(queryBuf, fessConfig.getIndexFieldLang(), params.getLanguages()); + } + + final String query = queryBuf.toString().trim(); + + final QueryContext queryContext = queryHelper.build(query, context -> { + context.skipRoleQuery(); + }); + return fessEsClient.deleteByQuery(fessConfig.getIndexDocumentIndex(), fessConfig.getIndexDocumentType(), + queryContext.getQueryBuilder()); + } + protected void storeSearchLog(final HttpServletRequest request, final LocalDateTime requestedTime, final String queryId, final String query, final int pageStart, final int pageSize, final QueryResponseList queryResponseList) { 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 dc68bcb34..9fdce37ef 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 @@ -22,6 +22,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.codelibs.core.lang.StringUtil; +import org.codelibs.fess.Constants; import org.codelibs.fess.app.service.SearchService; import org.codelibs.fess.app.web.base.FessAdminAction; import org.codelibs.fess.entity.SearchRenderData; @@ -109,19 +110,19 @@ public class AdminSearchlistAction extends FessAdminAction { // ============== @Execute public HtmlResponse index(final ListForm form) { + saveToken(); validate(form, messages -> {}, () -> asHtml(path_AdminError_AdminErrorJsp)); - return asHtml(path_AdminSearchlist_AdminSearchlistJsp); + return asListHtml(); } protected HtmlResponse doSearch(final ListForm form) { - validate(form, messages -> {}, () -> asHtml(path_AdminSearchlist_AdminSearchlistJsp)); + validate(form, messages -> {}, () -> asListHtml()); if (StringUtil.isBlank(form.query)) { - // redirect to index page - form.query = null; - return redirect(getClass()); + // query matches on all documents. + form.query = Constants.MATCHES_ALL_QUERY; } - return asHtml(path_AdminSearchlist_AdminSearchlistJsp).renderWith(data -> { + return asListHtml().renderWith(data -> { doSearchInternal(data, form); }); } @@ -135,7 +136,7 @@ public class AdminSearchlistAction extends FessAdminAction { if (logger.isDebugEnabled()) { logger.debug(e.getMessage(), e); } - throwValidationError(e.getMessageCode(), () -> asHtml(path_AdminSearchlist_AdminSearchlistJsp)); + throwValidationError(e.getMessageCode(), () -> asListHtml()); } catch (final ResultOffsetExceededException e) { if (logger.isDebugEnabled()) { logger.debug(e.getMessage(), e); @@ -148,21 +149,25 @@ public class AdminSearchlistAction extends FessAdminAction { @Execute public HtmlResponse search(final ListForm form) { + saveToken(); return doSearch(form); } @Execute public HtmlResponse prev(final ListForm form) { + saveToken(); return doMove(form, -1); } @Execute public HtmlResponse next(final ListForm form) { + saveToken(); return doMove(form, 1); } @Execute public HtmlResponse move(final ListForm form) { + saveToken(); return doMove(form, 0); } @@ -185,27 +190,53 @@ public class AdminSearchlistAction extends FessAdminAction { @Execute public HtmlResponse delete(final DeleteForm form) { - validate(form, messages -> {}, () -> asHtml(path_AdminSearchlist_AdminSearchlistJsp)); + verifyToken(() -> asListHtml()); + validate(form, messages -> {}, () -> asListHtml()); final String docId = form.docId; if (jobHelper.isCrawlProcessRunning()) { - throwValidationError(messages -> messages.addErrorsCannotDeleteDocBecauseOfRunning(GLOBAL), - () -> asHtml(path_AdminSearchlist_AdminSearchlistJsp)); + throwValidationError(messages -> messages.addErrorsCannotDeleteDocBecauseOfRunning(GLOBAL), () -> asListHtml()); } try { final QueryBuilder query = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId); fessEsClient.deleteByQuery(fessConfig.getIndexDocumentIndex(), fessConfig.getIndexDocumentType(), query); saveInfo(messages -> messages.addSuccessDeleteDocFromIndex(GLOBAL)); } catch (final Exception e) { - throwValidationError(messages -> messages.addErrorsFailedToDeleteDocInAdmin(GLOBAL), - () -> asHtml(path_AdminSearchlist_AdminSearchlistJsp)); + throwValidationError(messages -> messages.addErrorsFailedToDeleteDocInAdmin(GLOBAL), () -> asListHtml()); } - return redirectWith(getClass(), moreUrl("search").params("query", form.query)); + return asListHtml(); + } + + @Execute + public HtmlResponse deleteall(final ListForm form) { + verifyToken(() -> asListHtml()); + validate(form, messages -> {}, () -> asListHtml()); + if (jobHelper.isCrawlProcessRunning()) { + throwValidationError(messages -> messages.addErrorsCannotDeleteDocBecauseOfRunning(GLOBAL), () -> asListHtml()); + } + try { + searchService.deleteByQuery(request, form); + saveInfo(messages -> messages.addSuccessDeleteDocFromIndex(GLOBAL)); + } catch (final InvalidQueryException e) { + if (logger.isDebugEnabled()) { + logger.debug(e.getMessage(), e); + } + throwValidationError(e.getMessageCode(), () -> asListHtml()); + } + return asListHtml(); } public boolean isSolrProcessRunning() { return jobHelper.isCrawlProcessRunning(); } + // =================================================================================== + // JSP + // ========= + + private HtmlResponse asListHtml() { + return asHtml(path_AdminSearchlist_AdminSearchlistJsp); + } + protected static class WebRenderData extends SearchRenderData { private final RenderData data; diff --git a/src/main/java/org/codelibs/fess/es/config/allcommon/EsAbstractConditionBean.java b/src/main/java/org/codelibs/fess/es/config/allcommon/EsAbstractConditionBean.java index 04adeb26c..c68d5441b 100644 --- a/src/main/java/org/codelibs/fess/es/config/allcommon/EsAbstractConditionBean.java +++ b/src/main/java/org/codelibs/fess/es/config/allcommon/EsAbstractConditionBean.java @@ -654,7 +654,7 @@ public abstract class EsAbstractConditionBean implements ConditionBean { if (searchType != null) { builder.setSearchType(searchType); } - if (timeoutInMillis != -1) { + if (timeoutInMillis == -1) { builder.setTimeout(new TimeValue(timeoutInMillis)); } if (version != null) { diff --git a/src/main/java/org/codelibs/fess/es/config/allcommon/EsAbstractConditionQuery.java b/src/main/java/org/codelibs/fess/es/config/allcommon/EsAbstractConditionQuery.java index ac237d822..0b40e9ef0 100644 --- a/src/main/java/org/codelibs/fess/es/config/allcommon/EsAbstractConditionQuery.java +++ b/src/main/java/org/codelibs/fess/es/config/allcommon/EsAbstractConditionQuery.java @@ -164,7 +164,6 @@ public abstract class EsAbstractConditionQuery implements ConditionQuery { filterList.forEach(query -> { boolQuery.filter(query); }); - regQ(boolQuery); return boolQuery; } diff --git a/src/main/java/org/codelibs/fess/es/log/allcommon/EsAbstractConditionBean.java b/src/main/java/org/codelibs/fess/es/log/allcommon/EsAbstractConditionBean.java index 29f0c17be..8408c3244 100644 --- a/src/main/java/org/codelibs/fess/es/log/allcommon/EsAbstractConditionBean.java +++ b/src/main/java/org/codelibs/fess/es/log/allcommon/EsAbstractConditionBean.java @@ -654,7 +654,7 @@ public abstract class EsAbstractConditionBean implements ConditionBean { if (searchType != null) { builder.setSearchType(searchType); } - if (timeoutInMillis != -1) { + if (timeoutInMillis == -1) { builder.setTimeout(new TimeValue(timeoutInMillis)); } if (version != null) { diff --git a/src/main/java/org/codelibs/fess/es/log/allcommon/EsAbstractConditionQuery.java b/src/main/java/org/codelibs/fess/es/log/allcommon/EsAbstractConditionQuery.java index 5e7cb3a84..f43ba1b97 100644 --- a/src/main/java/org/codelibs/fess/es/log/allcommon/EsAbstractConditionQuery.java +++ b/src/main/java/org/codelibs/fess/es/log/allcommon/EsAbstractConditionQuery.java @@ -164,7 +164,6 @@ public abstract class EsAbstractConditionQuery implements ConditionQuery { filterList.forEach(query -> { boolQuery.filter(query); }); - regQ(boolQuery); return boolQuery; } diff --git a/src/main/java/org/codelibs/fess/es/user/allcommon/EsAbstractConditionBean.java b/src/main/java/org/codelibs/fess/es/user/allcommon/EsAbstractConditionBean.java index 4e25d5bed..8a23f9df1 100644 --- a/src/main/java/org/codelibs/fess/es/user/allcommon/EsAbstractConditionBean.java +++ b/src/main/java/org/codelibs/fess/es/user/allcommon/EsAbstractConditionBean.java @@ -654,7 +654,7 @@ public abstract class EsAbstractConditionBean implements ConditionBean { if (searchType != null) { builder.setSearchType(searchType); } - if (timeoutInMillis != -1) { + if (timeoutInMillis == -1) { builder.setTimeout(new TimeValue(timeoutInMillis)); } if (version != null) { diff --git a/src/main/java/org/codelibs/fess/es/user/allcommon/EsAbstractConditionQuery.java b/src/main/java/org/codelibs/fess/es/user/allcommon/EsAbstractConditionQuery.java index 91e6c312e..4bc28c238 100644 --- a/src/main/java/org/codelibs/fess/es/user/allcommon/EsAbstractConditionQuery.java +++ b/src/main/java/org/codelibs/fess/es/user/allcommon/EsAbstractConditionQuery.java @@ -164,7 +164,6 @@ public abstract class EsAbstractConditionQuery implements ConditionQuery { filterList.forEach(query -> { boolQuery.filter(query); }); - regQ(boolQuery); return boolQuery; } diff --git a/src/main/java/org/codelibs/fess/helper/QueryHelper.java b/src/main/java/org/codelibs/fess/helper/QueryHelper.java index 523af038b..e74a6631b 100644 --- a/src/main/java/org/codelibs/fess/helper/QueryHelper.java +++ b/src/main/java/org/codelibs/fess/helper/QueryHelper.java @@ -40,6 +40,7 @@ import org.apache.lucene.queryparser.ext.ExtendableQueryParser; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.FuzzyQuery; +import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; @@ -299,6 +300,8 @@ public class QueryHelper implements Serializable { } else if (query instanceof BooleanQuery) { final BooleanQuery booleanQuery = (BooleanQuery) query; return convertBooleanQuery(context, booleanQuery); + } else if (query instanceof MatchAllDocsQuery) { + return QueryBuilders.matchAllQuery(); } throw new InvalidQueryException(messages -> messages.addErrorsInvalidQueryUnknown(ActionMessages.GLOBAL_PROPERTY_KEY), "Unknown query: " + query.getClass() + " => " + query); diff --git a/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java b/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java index d46d228c2..fb0b37f6b 100644 --- a/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java +++ b/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java @@ -1488,13 +1488,19 @@ public class FessLabels extends ActionMessages { public static final String LABELS_search_list_configuration = "{labels.search_list_configuration}"; /** The key of the message: Delete */ - public static final String LABELS_search_list_delete_link = "{labels.search_list_delete_link}"; + public static final String LABELS_search_list_button_delete = "{labels.search_list_button_delete}"; + + /** The key of the message: Do you really want to delete? */ + public static final String LABELS_search_list_delete_confirmation = "{labels.search_list_delete_confirmation}"; + + /** The key of the message: Delete all with this query */ + public static final String LABELS_search_list_button_delete_all = "{labels.search_list_button_delete_all}"; + + /** The key of the message: Do you really want to delete all with this query? */ + public static final String LABELS_search_list_delete_all_confirmation = "{labels.search_list_delete_all_confirmation}"; /** The key of the message: Cancel */ - public static final String LABELS_search_list_delete_cancel = "{labels.search_list_delete_cancel}"; - - /** The key of the message: Do you really want to delete? ({0}) */ - public static final String LABELS_search_list_delete_confirmation = "{labels.search_list_delete_confirmation}"; + public static final String LABELS_search_list_button_cancel = "{labels.search_list_button_cancel}"; /** The key of the message: Failure URL */ public static final String LABELS_failure_url_configuration = "{labels.failure_url_configuration}"; diff --git a/src/main/resources/fess_label.properties b/src/main/resources/fess_label.properties index 5aaac4ee8..7a2ed2c2e 100644 --- a/src/main/resources/fess_label.properties +++ b/src/main/resources/fess_label.properties @@ -493,9 +493,11 @@ labels.wizard_start_crawling_desc=To click "Start Crawling" button, you can star labels.wizard_button_start_crawling=Start Crawling labels.wizard_button_finish=Skip labels.search_list_configuration=Search -labels.search_list_delete_link=Delete -labels.search_list_delete_cancel=Cancel -labels.search_list_delete_confirmation=Do you really want to delete? ({0}) +labels.search_list_button_delete=Delete +labels.search_list_delete_confirmation=Do you really want to delete? +labels.search_list_button_delete_all=Delete all with this query +labels.search_list_delete_all_confirmation=Do you really want to delete all with this query? +labels.search_list_button_cancel=Cancel labels.failure_url_configuration=Failure URL labels.failure_url_search_url=URL labels.failure_url_search_error_count=Error Count diff --git a/src/main/webapp/WEB-INF/view/admin/crawlinginfo/admin_crawlinginfo.jsp b/src/main/webapp/WEB-INF/view/admin/crawlinginfo/admin_crawlinginfo.jsp index 347cc6801..a6e207080 100644 --- a/src/main/webapp/WEB-INF/view/admin/crawlinginfo/admin_crawlinginfo.jsp +++ b/src/main/webapp/WEB-INF/view/admin/crawlinginfo/admin_crawlinginfo.jsp @@ -55,7 +55,8 @@ styleClass="form-control" placeholder="${ph_session_id}">