fix #425 : use search preference
This commit is contained in:
parent
024766fd85
commit
ea6ababe62
21 changed files with 216 additions and 79 deletions
|
@ -376,4 +376,6 @@ public class Constants extends CoreLibConstants {
|
|||
public static final String PAGING_QUERY_LIST = "pagingQueryList";
|
||||
|
||||
public static final String REQUEST_LANGUAGES = "requestLanguages";
|
||||
|
||||
public static final String SEARCH_PREFERENCE_PRIMARY = "_primary";
|
||||
}
|
||||
|
|
|
@ -57,6 +57,7 @@ import org.codelibs.fess.util.DocumentUtil;
|
|||
import org.codelibs.fess.util.FacetResponse;
|
||||
import org.codelibs.fess.util.FacetResponse.Field;
|
||||
import org.codelibs.fess.util.StreamUtil;
|
||||
import org.dbflute.optional.OptionalThing;
|
||||
import org.elasticsearch.script.Script;
|
||||
import org.lastaflute.web.util.LaRequestUtil;
|
||||
import org.slf4j.Logger;
|
||||
|
@ -145,7 +146,7 @@ public class JsonApiManager extends BaseApiManager {
|
|||
try {
|
||||
final SearchRenderData data = new SearchRenderData();
|
||||
final SearchApiRequestParams params = new SearchApiRequestParams(request, fessConfig);
|
||||
searchService.search(request, params, data);
|
||||
searchService.search(request, params, data, OptionalThing.empty());
|
||||
query = params.getQuery();
|
||||
final String execTime = data.getExecTime();
|
||||
final String queryTime = Long.toString(data.getQueryTime());
|
||||
|
@ -379,52 +380,53 @@ public class JsonApiManager extends BaseApiManager {
|
|||
throw new WebApiException(6, "No searched urls.");
|
||||
}
|
||||
|
||||
searchService.getDocumentByDocId(docId, new String[] { fessConfig.getIndexFieldUrl() }).ifPresent(doc -> {
|
||||
final String favoriteUrl = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class);
|
||||
final String userCode = userInfoHelper.getUserCode();
|
||||
searchService.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();
|
||||
|
||||
if (StringUtil.isBlank(userCode)) {
|
||||
throw new WebApiException(2, "No user session.");
|
||||
} else if (StringUtil.isBlank(favoriteUrl)) {
|
||||
throw new WebApiException(2, "URL is null.");
|
||||
}
|
||||
if (StringUtil.isBlank(userCode)) {
|
||||
throw new WebApiException(2, "No user session.");
|
||||
} else if (StringUtil.isBlank(favoriteUrl)) {
|
||||
throw new WebApiException(2, "URL is null.");
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (final String id : docIds) {
|
||||
if (docId.equals(id)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
throw new WebApiException(5, "Not found: " + favoriteUrl);
|
||||
}
|
||||
boolean found = false;
|
||||
for (final String id : docIds) {
|
||||
if (docId.equals(id)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
throw new WebApiException(5, "Not found: " + favoriteUrl);
|
||||
}
|
||||
|
||||
if (!favoriteLogService.addUrl(userCode, (userInfo, favoriteLog) -> {
|
||||
favoriteLog.setUserInfoId(userInfo.getId());
|
||||
favoriteLog.setUrl(favoriteUrl);
|
||||
favoriteLog.setDocId(docId);
|
||||
favoriteLog.setQueryId(queryId);
|
||||
favoriteLog.setCreatedAt(systemHelper.getCurrentTimeAsLocalDateTime());
|
||||
})) {
|
||||
throw new WebApiException(4, "Failed to add url: " + favoriteUrl);
|
||||
}
|
||||
if (!favoriteLogService.addUrl(userCode, (userInfo, favoriteLog) -> {
|
||||
favoriteLog.setUserInfoId(userInfo.getId());
|
||||
favoriteLog.setUrl(favoriteUrl);
|
||||
favoriteLog.setDocId(docId);
|
||||
favoriteLog.setQueryId(queryId);
|
||||
favoriteLog.setCreatedAt(systemHelper.getCurrentTimeAsLocalDateTime());
|
||||
})) {
|
||||
throw new WebApiException(4, "Failed to add url: " + favoriteUrl);
|
||||
}
|
||||
|
||||
final String id = DocumentUtil.getValue(doc, fessConfig.getIndexFieldId(), String.class);
|
||||
searchService.update(id, builder -> {
|
||||
final Script script = new Script("ctx._source." + fessConfig.getIndexFieldFavoriteCount() + "+=1");
|
||||
builder.setScript(script);
|
||||
final Map<String, Object> upsertMap = new HashMap<>();
|
||||
upsertMap.put(fessConfig.getIndexFieldFavoriteCount(), 1);
|
||||
builder.setUpsert(upsertMap);
|
||||
builder.setRefresh(true);
|
||||
});
|
||||
final String id = DocumentUtil.getValue(doc, fessConfig.getIndexFieldId(), String.class);
|
||||
searchService.update(id, builder -> {
|
||||
final Script script = new Script("ctx._source." + fessConfig.getIndexFieldFavoriteCount() + "+=1");
|
||||
builder.setScript(script);
|
||||
final Map<String, Object> upsertMap = new HashMap<>();
|
||||
upsertMap.put(fessConfig.getIndexFieldFavoriteCount(), 1);
|
||||
builder.setUpsert(upsertMap);
|
||||
builder.setRefresh(true);
|
||||
});
|
||||
|
||||
writeJsonResponse(0, "\"result\":\"ok\"", null);
|
||||
writeJsonResponse(0, "\"result\":\"ok\"", null);
|
||||
|
||||
}).orElse(() -> {
|
||||
throw new WebApiException(6, "Not found: " + docId);
|
||||
});
|
||||
}).orElse(() -> {
|
||||
throw new WebApiException(6, "Not found: " + docId);
|
||||
});
|
||||
|
||||
} catch (final Exception e) {
|
||||
int status;
|
||||
|
@ -471,7 +473,7 @@ public class JsonApiManager extends BaseApiManager {
|
|||
searchService.getDocumentListByDocIds(
|
||||
docIds,
|
||||
new String[] { fessConfig.getIndexFieldUrl(), fessConfig.getIndexFieldDocId(),
|
||||
fessConfig.getIndexFieldFavoriteCount() });
|
||||
fessConfig.getIndexFieldFavoriteCount() }, OptionalThing.empty());
|
||||
List<String> urlList = new ArrayList<>(docList.size());
|
||||
for (final Map<String, Object> doc : docList) {
|
||||
final String urlObj = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class);
|
||||
|
|
|
@ -39,11 +39,13 @@ 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.mylasta.action.FessUserBean;
|
||||
import org.codelibs.fess.mylasta.direction.FessConfig;
|
||||
import org.codelibs.fess.util.ComponentUtil;
|
||||
import org.codelibs.fess.util.QueryResponseList;
|
||||
import org.codelibs.fess.util.QueryStringBuilder;
|
||||
import org.dbflute.optional.OptionalEntity;
|
||||
import org.dbflute.optional.OptionalThing;
|
||||
import org.dbflute.util.DfTypeUtil;
|
||||
import org.elasticsearch.ElasticsearchException;
|
||||
import org.elasticsearch.action.bulk.BulkRequestBuilder;
|
||||
|
@ -81,7 +83,8 @@ public class SearchService {
|
|||
// Method
|
||||
// ==============
|
||||
|
||||
public void search(final HttpServletRequest request, final SearchRequestParams params, final SearchRenderData data) {
|
||||
public void search(final HttpServletRequest request, final SearchRequestParams params, final SearchRenderData data,
|
||||
final OptionalThing<FessUserBean> userBean) {
|
||||
final long requestedTime = systemHelper.getCurrentTimeAsLong();
|
||||
|
||||
final long startTime = System.currentTimeMillis();
|
||||
|
@ -98,6 +101,7 @@ public class SearchService {
|
|||
fessConfig.getIndexDocumentSearchIndex(),
|
||||
fessConfig.getIndexDocumentType(),
|
||||
searchRequestBuilder -> {
|
||||
fessConfig.processSearchPreference(searchRequestBuilder, userBean);
|
||||
return SearchConditionBuilder.builder(searchRequestBuilder)
|
||||
.query(StringUtil.isBlank(sortField) ? query : query + " sort:" + sortField).offset(pageStart)
|
||||
.size(pageSize).facetInfo(params.getFacetInfo()).geoInfo(params.getGeoInfo())
|
||||
|
@ -212,19 +216,23 @@ public class SearchService {
|
|||
return StringUtil.EMPTY_STRINGS;
|
||||
}
|
||||
|
||||
public OptionalEntity<Map<String, Object>> getDocumentByDocId(final String docId, final String[] fields) {
|
||||
public OptionalEntity<Map<String, Object>> getDocumentByDocId(final String docId, final String[] fields,
|
||||
final OptionalThing<FessUserBean> userBean) {
|
||||
return fessEsClient.getDocument(fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), builder -> {
|
||||
builder.setQuery(QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId));
|
||||
builder.addFields(fields);
|
||||
fessConfig.processSearchPreference(builder, userBean);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> getDocumentListByDocIds(final String[] docIds, final String[] fields) {
|
||||
public List<Map<String, Object>> getDocumentListByDocIds(final String[] docIds, final String[] fields,
|
||||
final OptionalThing<FessUserBean> userBean) {
|
||||
return fessEsClient.getDocumentList(fessConfig.getIndexDocumentSearchIndex(), fessConfig.getIndexDocumentType(), builder -> {
|
||||
builder.setQuery(QueryBuilders.termsQuery(fessConfig.getIndexFieldDocId(), docIds));
|
||||
builder.setSize(fessConfig.getPagingSearchPageMaxSizeAsInteger().intValue());
|
||||
builder.addFields(fields);
|
||||
fessConfig.processSearchPreference(builder, userBean);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
|
|
@ -124,7 +124,7 @@ public class AdminSearchlistAction extends FessAdminAction {
|
|||
final WebRenderData renderData = new WebRenderData();
|
||||
form.initialize();
|
||||
try {
|
||||
searchService.search(request, form, renderData);
|
||||
searchService.search(request, form, renderData, getUserBean());
|
||||
return asListHtml().renderWith(data -> {
|
||||
renderData.register(data);
|
||||
});
|
||||
|
|
|
@ -61,6 +61,7 @@ public class CacheAction extends FessSearchAction {
|
|||
final TermQueryBuilder termQuery = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), form.docId);
|
||||
queryRequestBuilder.setQuery(termQuery);
|
||||
queryRequestBuilder.addFields(queryHelper.getCacheResponseFields());
|
||||
fessConfig.processSearchPreference(queryRequestBuilder, getUserBean());
|
||||
return true;
|
||||
}).orElse(null);
|
||||
} catch (final Exception e) {
|
||||
|
|
|
@ -79,6 +79,7 @@ public class GoAction extends FessSearchAction {
|
|||
final TermQueryBuilder termQuery = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), form.docId);
|
||||
queryRequestBuilder.setQuery(termQuery);
|
||||
queryRequestBuilder.addFields(fessConfig.getIndexFieldUrl(), fessConfig.getIndexFieldConfigId());
|
||||
fessConfig.processSearchPreference(queryRequestBuilder, getUserBean());
|
||||
return true;
|
||||
}).orElse(null);
|
||||
} catch (final Exception e) {
|
||||
|
|
|
@ -59,6 +59,7 @@ public class ScreenshotAction extends FessSearchAction {
|
|||
final TermQueryBuilder termQuery = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), form.docId);
|
||||
queryRequestBuilder.setQuery(termQuery);
|
||||
queryRequestBuilder.addFields(queryHelper.getResponseFields());
|
||||
fessConfig.processSearchPreference(queryRequestBuilder, getUserBean());
|
||||
return true;
|
||||
}).orElse(null);
|
||||
final String url = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class);
|
||||
|
|
|
@ -122,7 +122,7 @@ public class SearchAction extends FessSearchAction {
|
|||
form.lang = searchService.getLanguages(request, form);
|
||||
request.setAttribute(Constants.REQUEST_LANGUAGES, form.lang);
|
||||
final WebRenderData renderData = new WebRenderData();
|
||||
searchService.search(request, form, renderData);
|
||||
searchService.search(request, form, renderData, getUserBean());
|
||||
return asHtml(path_SearchJsp).renderWith(data -> {
|
||||
renderData.register(data);
|
||||
// favorite or screenshot
|
||||
|
|
|
@ -475,8 +475,8 @@ public class FessEsClient implements Client {
|
|||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
SearchResponse response =
|
||||
client.prepareSearch(index).setTypes(type).setScroll(scrollForDelete).setSize(sizeForDelete)
|
||||
.addField(fessConfig.getIndexFieldId()).setQuery(queryBuilder).execute()
|
||||
.actionGet(fessConfig.getIndexScrollSearchTimeoutTimeout());
|
||||
.addField(fessConfig.getIndexFieldId()).setQuery(queryBuilder).setPreference(Constants.SEARCH_PREFERENCE_PRIMARY)
|
||||
.execute().actionGet(fessConfig.getIndexScrollSearchTimeoutTimeout());
|
||||
|
||||
int count = 0;
|
||||
String scrollId = response.getScrollId();
|
||||
|
|
|
@ -88,7 +88,11 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
protected int delegateSelectCountUniquely(final ConditionBean cb) {
|
||||
// #pending check response and cast problem
|
||||
final SearchRequestBuilder builder = client.prepareSearch(asEsIndex()).setTypes(asEsSearchType());
|
||||
return (int) ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(searchTimeout).getHits().getTotalHits();
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
builder.setPreference(esCb.getPreference());
|
||||
}
|
||||
return (int) esCb.build(builder).execute().actionGet(searchTimeout).getHits().getTotalHits();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -119,8 +123,12 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
}
|
||||
builder.setFrom(from);
|
||||
builder.setSize(size);
|
||||
((EsAbstractConditionBean) cb).request().build(builder);
|
||||
final SearchResponse response = ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(searchTimeout);
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
builder.setPreference(esCb.getPreference());
|
||||
}
|
||||
esCb.request().build(builder);
|
||||
final SearchResponse response = esCb.build(builder).execute().actionGet(searchTimeout);
|
||||
|
||||
final EsPagingResultBean<RESULT> list = new EsPagingResultBean<>();
|
||||
final SearchHits searchHits = response.getHits();
|
||||
|
@ -200,8 +208,12 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
if (response == null) {
|
||||
final SearchRequestBuilder builder =
|
||||
client.prepareSearch(asEsIndex()).setTypes(asEsIndexType()).setScroll(scrollForCursor).setSize(sizeForCursor);
|
||||
((EsAbstractConditionBean) cb).request().build(builder);
|
||||
response = ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
builder.setPreference(esCb.getPreference());
|
||||
}
|
||||
esCb.request().build(builder);
|
||||
response = esCb.build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
} else {
|
||||
final String scrollId = response.getScrollId();
|
||||
response = client.prepareSearchScroll(scrollId).setScroll(scrollForDelete).execute().actionGet(scrollSearchTimeout);
|
||||
|
@ -311,8 +323,12 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
if (response == null) {
|
||||
final SearchRequestBuilder builder =
|
||||
client.prepareSearch(asEsIndex()).setTypes(asEsIndexType()).setScroll(scrollForDelete).setSize(sizeForDelete);
|
||||
((EsAbstractConditionBean) cb).request().build(builder);
|
||||
response = ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
esCb.setPreference(esCb.getPreference());
|
||||
}
|
||||
esCb.request().build(builder);
|
||||
response = esCb.build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
} else {
|
||||
final String scrollId = response.getScrollId();
|
||||
response = client.prepareSearchScroll(scrollId).setScroll(scrollForDelete).execute().actionGet(scrollSearchTimeout);
|
||||
|
|
|
@ -51,7 +51,8 @@ public abstract class EsAbstractConditionBean implements ConditionBean {
|
|||
// =========
|
||||
protected final SqlClause _sqlClause = new EsSqlClause(asTableDbName());
|
||||
protected int _safetyMaxResultSize;
|
||||
private SearchRequestParams _searchRequestParams = new SearchRequestParams();
|
||||
protected SearchRequestParams _searchRequestParams = new SearchRequestParams();
|
||||
protected String _preference;
|
||||
|
||||
// ===================================================================================
|
||||
// Builder
|
||||
|
@ -599,6 +600,14 @@ public abstract class EsAbstractConditionBean implements ConditionBean {
|
|||
return _searchRequestParams;
|
||||
}
|
||||
|
||||
public void setPreference(final String preference) {
|
||||
_preference = preference;
|
||||
}
|
||||
|
||||
public String getPreference() {
|
||||
return _preference;
|
||||
}
|
||||
|
||||
// ===================================================================================
|
||||
// General Helper
|
||||
// ==============
|
||||
|
|
|
@ -88,7 +88,11 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
protected int delegateSelectCountUniquely(final ConditionBean cb) {
|
||||
// #pending check response and cast problem
|
||||
final SearchRequestBuilder builder = client.prepareSearch(asEsIndex()).setTypes(asEsSearchType());
|
||||
return (int) ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(searchTimeout).getHits().getTotalHits();
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
builder.setPreference(esCb.getPreference());
|
||||
}
|
||||
return (int) esCb.build(builder).execute().actionGet(searchTimeout).getHits().getTotalHits();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -119,8 +123,12 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
}
|
||||
builder.setFrom(from);
|
||||
builder.setSize(size);
|
||||
((EsAbstractConditionBean) cb).request().build(builder);
|
||||
final SearchResponse response = ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(searchTimeout);
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
builder.setPreference(esCb.getPreference());
|
||||
}
|
||||
esCb.request().build(builder);
|
||||
final SearchResponse response = esCb.build(builder).execute().actionGet(searchTimeout);
|
||||
|
||||
final EsPagingResultBean<RESULT> list = new EsPagingResultBean<>();
|
||||
final SearchHits searchHits = response.getHits();
|
||||
|
@ -200,8 +208,12 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
if (response == null) {
|
||||
final SearchRequestBuilder builder =
|
||||
client.prepareSearch(asEsIndex()).setTypes(asEsIndexType()).setScroll(scrollForCursor).setSize(sizeForCursor);
|
||||
((EsAbstractConditionBean) cb).request().build(builder);
|
||||
response = ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
builder.setPreference(esCb.getPreference());
|
||||
}
|
||||
esCb.request().build(builder);
|
||||
response = esCb.build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
} else {
|
||||
final String scrollId = response.getScrollId();
|
||||
response = client.prepareSearchScroll(scrollId).setScroll(scrollForDelete).execute().actionGet(scrollSearchTimeout);
|
||||
|
@ -311,8 +323,12 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
if (response == null) {
|
||||
final SearchRequestBuilder builder =
|
||||
client.prepareSearch(asEsIndex()).setTypes(asEsIndexType()).setScroll(scrollForDelete).setSize(sizeForDelete);
|
||||
((EsAbstractConditionBean) cb).request().build(builder);
|
||||
response = ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
esCb.setPreference(esCb.getPreference());
|
||||
}
|
||||
esCb.request().build(builder);
|
||||
response = esCb.build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
} else {
|
||||
final String scrollId = response.getScrollId();
|
||||
response = client.prepareSearchScroll(scrollId).setScroll(scrollForDelete).execute().actionGet(scrollSearchTimeout);
|
||||
|
|
|
@ -51,7 +51,8 @@ public abstract class EsAbstractConditionBean implements ConditionBean {
|
|||
// =========
|
||||
protected final SqlClause _sqlClause = new EsSqlClause(asTableDbName());
|
||||
protected int _safetyMaxResultSize;
|
||||
private SearchRequestParams _searchRequestParams = new SearchRequestParams();
|
||||
protected SearchRequestParams _searchRequestParams = new SearchRequestParams();
|
||||
protected String _preference;
|
||||
|
||||
// ===================================================================================
|
||||
// Builder
|
||||
|
@ -599,6 +600,14 @@ public abstract class EsAbstractConditionBean implements ConditionBean {
|
|||
return _searchRequestParams;
|
||||
}
|
||||
|
||||
public void setPreference(final String preference) {
|
||||
_preference = preference;
|
||||
}
|
||||
|
||||
public String getPreference() {
|
||||
return _preference;
|
||||
}
|
||||
|
||||
// ===================================================================================
|
||||
// General Helper
|
||||
// ==============
|
||||
|
|
|
@ -88,7 +88,11 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
protected int delegateSelectCountUniquely(final ConditionBean cb) {
|
||||
// #pending check response and cast problem
|
||||
final SearchRequestBuilder builder = client.prepareSearch(asEsIndex()).setTypes(asEsSearchType());
|
||||
return (int) ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(searchTimeout).getHits().getTotalHits();
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
builder.setPreference(esCb.getPreference());
|
||||
}
|
||||
return (int) esCb.build(builder).execute().actionGet(searchTimeout).getHits().getTotalHits();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -119,8 +123,12 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
}
|
||||
builder.setFrom(from);
|
||||
builder.setSize(size);
|
||||
((EsAbstractConditionBean) cb).request().build(builder);
|
||||
final SearchResponse response = ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(searchTimeout);
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
builder.setPreference(esCb.getPreference());
|
||||
}
|
||||
esCb.request().build(builder);
|
||||
final SearchResponse response = esCb.build(builder).execute().actionGet(searchTimeout);
|
||||
|
||||
final EsPagingResultBean<RESULT> list = new EsPagingResultBean<>();
|
||||
final SearchHits searchHits = response.getHits();
|
||||
|
@ -200,8 +208,12 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
if (response == null) {
|
||||
final SearchRequestBuilder builder =
|
||||
client.prepareSearch(asEsIndex()).setTypes(asEsIndexType()).setScroll(scrollForCursor).setSize(sizeForCursor);
|
||||
((EsAbstractConditionBean) cb).request().build(builder);
|
||||
response = ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
builder.setPreference(esCb.getPreference());
|
||||
}
|
||||
esCb.request().build(builder);
|
||||
response = esCb.build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
} else {
|
||||
final String scrollId = response.getScrollId();
|
||||
response = client.prepareSearchScroll(scrollId).setScroll(scrollForDelete).execute().actionGet(scrollSearchTimeout);
|
||||
|
@ -311,8 +323,12 @@ public abstract class EsAbstractBehavior<ENTITY extends Entity, CB extends Condi
|
|||
if (response == null) {
|
||||
final SearchRequestBuilder builder =
|
||||
client.prepareSearch(asEsIndex()).setTypes(asEsIndexType()).setScroll(scrollForDelete).setSize(sizeForDelete);
|
||||
((EsAbstractConditionBean) cb).request().build(builder);
|
||||
response = ((EsAbstractConditionBean) cb).build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
final EsAbstractConditionBean esCb = (EsAbstractConditionBean) cb;
|
||||
if (esCb.getPreference() != null) {
|
||||
esCb.setPreference(esCb.getPreference());
|
||||
}
|
||||
esCb.request().build(builder);
|
||||
response = esCb.build(builder).execute().actionGet(scrollSearchTimeout);
|
||||
} else {
|
||||
final String scrollId = response.getScrollId();
|
||||
response = client.prepareSearchScroll(scrollId).setScroll(scrollForDelete).execute().actionGet(scrollSearchTimeout);
|
||||
|
|
|
@ -51,7 +51,8 @@ public abstract class EsAbstractConditionBean implements ConditionBean {
|
|||
// =========
|
||||
protected final SqlClause _sqlClause = new EsSqlClause(asTableDbName());
|
||||
protected int _safetyMaxResultSize;
|
||||
private SearchRequestParams _searchRequestParams = new SearchRequestParams();
|
||||
protected SearchRequestParams _searchRequestParams = new SearchRequestParams();
|
||||
protected String _preference;
|
||||
|
||||
// ===================================================================================
|
||||
// Builder
|
||||
|
@ -599,6 +600,14 @@ public abstract class EsAbstractConditionBean implements ConditionBean {
|
|||
return _searchRequestParams;
|
||||
}
|
||||
|
||||
public void setPreference(final String preference) {
|
||||
_preference = preference;
|
||||
}
|
||||
|
||||
public String getPreference() {
|
||||
return _preference;
|
||||
}
|
||||
|
||||
// ===================================================================================
|
||||
// General Helper
|
||||
// ==============
|
||||
|
|
|
@ -170,6 +170,7 @@ public class CrawlingInfoHelper implements Serializable {
|
|||
AggregationBuilders.terms(fessConfig.getIndexFieldSegment()).field(fessConfig.getIndexFieldSegment())
|
||||
.size(maxSessionIdsInList).order(Order.term(false));
|
||||
queryRequestBuilder.addAggregation(termsBuilder);
|
||||
queryRequestBuilder.setPreference(Constants.SEARCH_PREFERENCE_PRIMARY);
|
||||
return true;
|
||||
}, (queryRequestBuilder, execTime, searchResponse) -> {
|
||||
final List<Map<String, String>> sessionIdList = new ArrayList<Map<String, String>>();
|
||||
|
|
|
@ -24,6 +24,7 @@ import java.util.Map;
|
|||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.codelibs.core.misc.Pair;
|
||||
import org.codelibs.fess.Constants;
|
||||
import org.codelibs.fess.app.service.KeyMatchService;
|
||||
import org.codelibs.fess.es.client.FessEsClient;
|
||||
import org.codelibs.fess.es.client.FessEsClient.SearchConditionBuilder;
|
||||
|
@ -93,8 +94,8 @@ public class KeyMatchHelper {
|
|||
fessConfig.getIndexDocumentSearchIndex(),
|
||||
fessConfig.getIndexDocumentType(),
|
||||
searchRequestBuilder -> {
|
||||
return SearchConditionBuilder.builder(searchRequestBuilder).administrativeAccess(true)
|
||||
.size(keyMatch.getMaxSize()).query(keyMatch.getQuery())
|
||||
return SearchConditionBuilder.builder(searchRequestBuilder.setPreference(Constants.SEARCH_PREFERENCE_PRIMARY))
|
||||
.administrativeAccess(true).size(keyMatch.getMaxSize()).query(keyMatch.getQuery())
|
||||
.responseFields(new String[] { fessConfig.getIndexFieldDocId() }).build();
|
||||
});
|
||||
return documentList;
|
||||
|
|
|
@ -48,6 +48,7 @@ import org.codelibs.fess.util.ComponentUtil;
|
|||
import org.codelibs.fess.util.DocumentUtil;
|
||||
import org.codelibs.fess.util.QueryResponseList;
|
||||
import org.codelibs.fess.util.StreamUtil;
|
||||
import org.dbflute.optional.OptionalThing;
|
||||
import org.elasticsearch.action.update.UpdateRequest;
|
||||
import org.elasticsearch.script.Script;
|
||||
import org.lastaflute.di.core.SingletonLaContainer;
|
||||
|
@ -302,7 +303,7 @@ public class SearchLogHelper {
|
|||
searchService.bulkUpdate(builder -> {
|
||||
final FessConfig fessConfig = ComponentUtil.getFessConfig();
|
||||
searchService.getDocumentListByDocIds(clickCountMap.keySet().toArray(new String[clickCountMap.size()]),
|
||||
new String[] { fessConfig.getIndexFieldDocId() }).forEach(
|
||||
new String[] { fessConfig.getIndexFieldDocId() }, OptionalThing.of(FessUserBean.empty())).forEach(
|
||||
doc -> {
|
||||
final String id = DocumentUtil.getValue(doc, fessConfig.getIndexFieldId(), String.class);
|
||||
final String docId = DocumentUtil.getValue(doc, fessConfig.getIndexFieldDocId(), String.class);
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
package org.codelibs.fess.mylasta.action;
|
||||
|
||||
import org.codelibs.core.lang.StringUtil;
|
||||
import org.codelibs.fess.entity.FessUser;
|
||||
import org.codelibs.fess.util.StreamUtil;
|
||||
import org.lastaflute.web.login.TypicalUserBean;
|
||||
|
@ -76,4 +77,25 @@ public class FessUserBean extends TypicalUserBean<String> { // #change_it also L
|
|||
public boolean hasGroups(final String[] acceptedGroups) {
|
||||
return StreamUtil.of(user.getGroupNames()).anyMatch(s1 -> StreamUtil.of(acceptedGroups).anyMatch(s2 -> s2.equals(s1)));
|
||||
}
|
||||
|
||||
public static FessUserBean empty() {
|
||||
return new FessUserBean(null) {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public String getUserId() {
|
||||
return "<empty>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasRoles(final String[] acceptedRoles) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getRoles() {
|
||||
return StringUtil.EMPTY_STRINGS;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -213,7 +213,7 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
|
|||
/** The key of the configuration. e.g. true */
|
||||
String INDEXER_FAVORITE_COUNT_ENABLED = "indexer.favorite.count.enabled";
|
||||
|
||||
/** The key of the configuration. e.g. 1000 */
|
||||
/** The key of the configuration. e.g. 5000 */
|
||||
String INDEXER_WEBFS_COMMIT_MARGIN_TIME = "indexer.webfs.commit.margin.time";
|
||||
|
||||
/** The key of the configuration. e.g. 60 */
|
||||
|
@ -1359,14 +1359,14 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
|
|||
|
||||
/**
|
||||
* Get the value for the key 'indexer.webfs.commit.margin.time'. <br>
|
||||
* The value is, e.g. 1000 <br>
|
||||
* The value is, e.g. 5000 <br>
|
||||
* @return The value of found property. (NotNull: if not found, exception but basically no way)
|
||||
*/
|
||||
String getIndexerWebfsCommitMarginTime();
|
||||
|
||||
/**
|
||||
* Get the value for the key 'indexer.webfs.commit.margin.time' as {@link Integer}. <br>
|
||||
* The value is, e.g. 1000 <br>
|
||||
* The value is, e.g. 5000 <br>
|
||||
* @return The value of found property. (NotNull: if not found, exception but basically no way)
|
||||
* @throws NumberFormatException When the property is not integer.
|
||||
*/
|
||||
|
|
|
@ -27,6 +27,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import javax.naming.directory.Attribute;
|
||||
import javax.naming.directory.BasicAttribute;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import org.codelibs.core.exception.ClassNotFoundRuntimeException;
|
||||
import org.codelibs.core.lang.StringUtil;
|
||||
|
@ -37,8 +38,10 @@ import org.codelibs.fess.mylasta.action.FessUserBean;
|
|||
import org.codelibs.fess.util.ComponentUtil;
|
||||
import org.codelibs.fess.util.StreamUtil;
|
||||
import org.dbflute.optional.OptionalThing;
|
||||
import org.elasticsearch.action.search.SearchRequestBuilder;
|
||||
import org.lastaflute.job.LaJob;
|
||||
import org.lastaflute.job.subsidiary.ConcurrentExec;
|
||||
import org.lastaflute.web.util.LaRequestUtil;
|
||||
|
||||
public interface FessProp {
|
||||
|
||||
|
@ -830,4 +833,23 @@ public interface FessProp {
|
|||
return StreamUtil.of(getCrawlerFileProtocolsAsArray()).anyMatch(s -> url.startsWith(s));
|
||||
}
|
||||
|
||||
public default void processSearchPreference(SearchRequestBuilder searchRequestBuilder, OptionalThing<FessUserBean> userBean) {
|
||||
userBean.map(user -> {
|
||||
if (user.hasRoles(getAuthenticationAdminRolesAsArray())) {
|
||||
return Constants.SEARCH_PREFERENCE_PRIMARY;
|
||||
}
|
||||
return user.getUserId();
|
||||
}).ifPresent(p -> searchRequestBuilder.setPreference(p)).orElse(() -> LaRequestUtil.getOptionalRequest().map(r -> {
|
||||
HttpSession session = r.getSession(false);
|
||||
if (session != null) {
|
||||
return session.getId();
|
||||
}
|
||||
final String preference = r.getParameter("preference");
|
||||
if (preference != null) {
|
||||
return Integer.toString(preference.hashCode());
|
||||
}
|
||||
return null;
|
||||
}).ifPresent(p -> searchRequestBuilder.setPreference(p)));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue