This commit is contained in:
Shinsuke Sugaya 2015-06-15 06:05:37 +09:00
parent db1fa4b72f
commit 55115343b0
22 changed files with 452 additions and 521 deletions

View file

@ -65,7 +65,8 @@
<poi.version>3.11-beta2</poi.version>
<pdfbox.version>1.8.7</pdfbox.version>
<saflute.version>1.0.0-SNAPSHOT</saflute.version>
<elasticsearch.version>1.5.0</elasticsearch.version>
<elasticsearch.version>1.6.0</elasticsearch.version>
<cluster.runner.version>1.6.0.0-SNAPSHOT</cluster.runner.version>
<!-- Tomcat -->
<tomcat.delegate>true</tomcat.delegate>
<tomcat.useSeparateTomcatClassLoader>true</tomcat.useSeparateTomcatClassLoader>
@ -363,7 +364,7 @@
<dependency>
<groupId>org.codelibs</groupId>
<artifactId>elasticsearch-cluster-runner</artifactId>
<version>1.5.0.1</version>
<version>${cluster.runner.version}</version>
</dependency>
<dependency>
<groupId>xalan</groupId>

View file

@ -303,4 +303,10 @@ public class Constants extends CoreLibConstants {
public static final String FACET_QUERY_PREFIX = "query:";
public static final String FESS_ES_TRANSPORT_ADDRESSES = "fess.es.transport_addresses";
public static final int DEFAULT_PAGE_SIZE = 20;
public static final int DEFAULT_START_COUNT = 0;
}

View file

@ -8,7 +8,6 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import org.apache.commons.codec.Charsets;
import org.codelibs.core.io.FileUtil;
@ -24,7 +23,6 @@ import org.codelibs.fess.entity.SearchQuery;
import org.codelibs.fess.entity.SearchQuery.SortField;
import org.codelibs.fess.solr.FessSolrQueryException;
import org.codelibs.fess.util.ComponentUtil;
import org.codelibs.fess.util.QueryResponseList;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.ShardOperationFailedException;
@ -40,6 +38,9 @@ import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.ImmutableSettings.Builder;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.unit.TimeValue;
@ -74,6 +75,14 @@ public class SearchClient {
protected String type = "doc";
protected String clusterName = "elasticsearch";
protected Map<String, String> settings;
public void setSettings(Map<String, String> settings) {
this.settings = settings;
}
public String getIndex() {
return index;
}
@ -90,6 +99,14 @@ public class SearchClient {
this.type = type;
}
public String getClusterName() {
return clusterName;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
public void setRunner(ElasticsearchClusterRunner runner) {
this.runner = runner;
}
@ -100,25 +117,72 @@ public class SearchClient {
@InitMethod
public void open() {
String transportAddressesValue = System.getProperty(Constants.FESS_ES_TRANSPORT_ADDRESSES);
if (StringUtil.isNotBlank(transportAddressesValue)) {
for (String transportAddressValue : transportAddressesValue.split(",")) {
String[] addressPair = transportAddressValue.trim().split(":");
if (addressPair.length < 3) {
String host = addressPair[0];
int port = 9300;
if (addressPair.length == 2) {
port = Integer.parseInt(addressPair[1]);
}
addTransportAddress(host, port);
} else {
logger.warn("Invalid address format: " + transportAddressValue);
}
}
}
if (transportAddressList.isEmpty()) {
if (runner == null) {
runner = new ElasticsearchClusterRunner();
Configs config = newConfigs().clusterName("fess-" + UUID.randomUUID().toString()).numOfNode(1);
Configs config = newConfigs().clusterName(clusterName).numOfNode(1);
String esDir = System.getProperty("fess.es.dir");
if (esDir != null) {
config.basePath(esDir);
}
runner.onBuild(new ElasticsearchClusterRunner.Builder() {
@Override
public void build(final int number, final Builder settingsBuilder) {
if (settings != null) {
settingsBuilder.put(settings);
}
}
});
runner.build(config);
}
client = runner.client();
addTransportAddress("localhost", runner.node().settings().getAsInt("transport.tcp.port", 9300));
} else {
TransportClient transportClient = new TransportClient();
Builder settingsBuilder = ImmutableSettings.settingsBuilder();
settingsBuilder.put("cluster.name", clusterName);
Settings settings = settingsBuilder.build();
TransportClient transportClient = new TransportClient(settings);
for (TransportAddress address : transportAddressList) {
transportClient.addTransportAddress(address);
}
client = transportClient;
}
if (StringUtil.isBlank(transportAddressesValue)) {
StringBuilder buf = new StringBuilder();
for (TransportAddress transportAddress : transportAddressList) {
if (transportAddress instanceof InetSocketTransportAddress) {
if (buf.length() > 0) {
buf.append(',');
}
InetSocketTransportAddress inetTransportAddress = (InetSocketTransportAddress) transportAddress;
buf.append(inetTransportAddress.address().getHostName());
buf.append(':');
buf.append(inetTransportAddress.address().getPort());
}
}
if (buf.length() > 0) {
System.setProperty(Constants.FESS_ES_TRANSPORT_ADDRESSES, buf.toString());
}
}
waitForYellowStatus();
if (!isIndexExists()) {
@ -158,6 +222,7 @@ public class SearchClient {
public void deleteByQuery(QueryBuilder queryBuilder) {
try {
// TODO replace with deleting bulk ids with scroll/scan
client.prepareDeleteByQuery(index).setQuery(queryBuilder).execute().actionGet().forEach(res -> {
ShardOperationFailedException[] failures = res.getFailures();
if (failures.length > 0) {
@ -178,25 +243,29 @@ public class SearchClient {
final long startTime = System.currentTimeMillis();
SearchResponse searchResponse = null;
SearchRequestBuilder queryRequestBuilder = client.prepareSearch(index);
if (condition.build(queryRequestBuilder)) {
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
if (condition.build(searchRequestBuilder)) {
if (ComponentUtil.getQueryHelper().getTimeAllowed() >= 0) {
queryRequestBuilder.setTimeout(TimeValue.timeValueMillis(ComponentUtil.getQueryHelper().getTimeAllowed()));
searchRequestBuilder.setTimeout(TimeValue.timeValueMillis(ComponentUtil.getQueryHelper().getTimeAllowed()));
}
for (final Map.Entry<String, String[]> entry : ComponentUtil.getQueryHelper().getQueryParamMap().entrySet()) {
searchRequestBuilder.putHeader(entry.getKey(), entry.getValue());
}
final Set<Entry<String, String[]>> paramSet = ComponentUtil.getQueryHelper().getRequestParameterSet();
if (!paramSet.isEmpty()) {
for (final Map.Entry<String, String[]> entry : paramSet) {
queryRequestBuilder.putHeader(entry.getKey(), entry.getValue());
searchRequestBuilder.putHeader(entry.getKey(), entry.getValue());
}
}
searchResponse = queryRequestBuilder.execute().actionGet();
searchResponse = searchRequestBuilder.execute().actionGet();
}
final long execTime = System.currentTimeMillis() - startTime;
return searchResult.build(queryRequestBuilder, execTime, Optional.ofNullable(searchResponse));
return searchResult.build(searchRequestBuilder, execTime, Optional.ofNullable(searchResponse));
}
public Optional<Map<String, Object>> getDocument(final SearchCondition condition) {
@ -212,7 +281,7 @@ public class SearchClient {
}
public Optional<List<Map<String, Object>>> getDocumentList(final SearchCondition condition) {
return search(condition, (queryRequestBuilder, execTime, searchResponse) -> {
return search(condition, (searchRequestBuilder, execTime, searchResponse) -> {
List<Map<String, Object>> list = new ArrayList<>();
searchResponse.ifPresent(response -> {
response.getHits().forEach(hit -> {
@ -223,150 +292,6 @@ public class SearchClient {
});
}
// TODO
public List<Map<String, Object>> getDocumentList(final String query, final int start, final int rows, final FacetInfo facetInfo,
final GeoInfo geoInfo, final String[] responseFields) {
return getDocumentList(query, start, rows, facetInfo, geoInfo, responseFields, true);
}
// TODO
public List<Map<String, Object>> getDocumentList(final String query, final int start, final int rows, final FacetInfo facetInfo,
final GeoInfo geoInfo, final String[] responseFields, final boolean forUser) {
if (start > ComponentUtil.getQueryHelper().getMaxSearchResultOffset()) {
throw new ResultOffsetExceededException("The number of result size is exceeded.");
}
final long startTime = System.currentTimeMillis();
SearchResponse searchResponse = null;
SearchRequestBuilder queryRequestBuilder = client.prepareSearch(index);
final SearchQuery searchQuery = ComponentUtil.getQueryHelper().build(query, forUser);
final String q = searchQuery.getQuery();
if (StringUtil.isNotBlank(q)) {
BoolFilterBuilder boolFilterBuilder = null;
// fields
queryRequestBuilder.addFields(responseFields);
// query
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery(q);
queryRequestBuilder.setFrom(start).setSize(rows);
for (final Map.Entry<String, String[]> entry : ComponentUtil.getQueryHelper().getQueryParamMap().entrySet()) {
queryRequestBuilder.putHeader(entry.getKey(), entry.getValue());
}
// filter query
if (searchQuery.hasFilterQueries()) {
if (boolFilterBuilder == null) {
boolFilterBuilder = FilterBuilders.boolFilter();
}
for (String filterQuery : searchQuery.getFilterQueries()) {
boolFilterBuilder.must(FilterBuilders.queryFilter(QueryBuilders.queryStringQuery(filterQuery)));
}
}
// sort
final SortField[] sortFields = searchQuery.getSortFields();
if (sortFields.length != 0) {
for (final SortField sortField : sortFields) {
FieldSortBuilder fieldSort = SortBuilders.fieldSort(sortField.getField());
if (Constants.DESC.equals(sortField.getOrder())) {
fieldSort.order(SortOrder.DESC);
} else {
fieldSort.order(SortOrder.ASC);
}
queryRequestBuilder.addSort(fieldSort);
}
} else if (ComponentUtil.getQueryHelper().hasDefaultSortFields()) {
for (final SortField sortField : ComponentUtil.getQueryHelper().getDefaultSortFields()) {
FieldSortBuilder fieldSort = SortBuilders.fieldSort(sortField.getField());
if (Constants.DESC.equals(sortField.getOrder())) {
fieldSort.order(SortOrder.DESC);
} else {
fieldSort.order(SortOrder.ASC);
}
queryRequestBuilder.addSort(fieldSort);
}
}
// highlighting
if (ComponentUtil.getQueryHelper().getHighlightingFields() != null
&& ComponentUtil.getQueryHelper().getHighlightingFields().length != 0) {
for (final String hf : ComponentUtil.getQueryHelper().getHighlightingFields()) {
queryRequestBuilder.addHighlightedField(hf, ComponentUtil.getQueryHelper().getHighlightSnippetSize());
}
}
// geo
if (geoInfo != null && geoInfo.isAvailable()) {
if (boolFilterBuilder == null) {
boolFilterBuilder = FilterBuilders.boolFilter();
}
boolFilterBuilder.must(geoInfo.toFilterBuilder());
}
// facets
if (facetInfo != null) {
if (facetInfo.field != null) {
for (final String f : facetInfo.field) {
if (ComponentUtil.getQueryHelper().isFacetField(f)) {
String encodedField = BaseEncoding.base64().encode(f.getBytes(Charsets.UTF_8));
TermsBuilder termsBuilder = AggregationBuilders.terms(Constants.FACET_FIELD_PREFIX + encodedField).field(f);
// TODO order
if (facetInfo.limit != null) {
// TODO
termsBuilder.size(Integer.parseInt(facetInfo.limit));
}
queryRequestBuilder.addAggregation(termsBuilder);
} else {
throw new FessSolrQueryException("Invalid facet field: " + f);
}
}
}
if (facetInfo.query != null) {
for (final String fq : facetInfo.query) {
final String facetQuery = ComponentUtil.getQueryHelper().buildFacetQuery(fq);
if (StringUtil.isNotBlank(facetQuery)) {
final String encodedFacetQuery = BaseEncoding.base64().encode(facetQuery.getBytes(Charsets.UTF_8));
FilterAggregationBuilder filterBuilder =
AggregationBuilders.filter(Constants.FACET_QUERY_PREFIX + encodedFacetQuery).filter(
FilterBuilders.queryFilter(QueryBuilders.queryStringQuery(facetQuery)));
// TODO order
if (facetInfo.limit != null) {
// TODO
// filterBuilder.size(Integer.parseInt(facetInfo .limit));
}
queryRequestBuilder.addAggregation(filterBuilder);
} else {
throw new FessSolrQueryException("Invalid facet query: " + facetQuery);
}
}
}
}
if (ComponentUtil.getQueryHelper().getTimeAllowed() >= 0) {
queryRequestBuilder.setTimeout(TimeValue.timeValueMillis(ComponentUtil.getQueryHelper().getTimeAllowed()));
}
final Set<Entry<String, String[]>> paramSet = ComponentUtil.getQueryHelper().getRequestParameterSet();
if (!paramSet.isEmpty()) {
for (final Map.Entry<String, String[]> entry : paramSet) {
queryRequestBuilder.putHeader(entry.getKey(), entry.getValue());
}
}
if (boolFilterBuilder != null) {
queryBuilder = QueryBuilders.filteredQuery(queryBuilder, boolFilterBuilder);
}
searchResponse = queryRequestBuilder.setQuery(queryBuilder).execute().actionGet();
}
final long execTime = System.currentTimeMillis() - startTime;
final QueryResponseList queryResponseList = ComponentUtil.getQueryResponseList();
queryResponseList.init(searchResponse, start, rows);
queryResponseList.setSearchQuery(q);
if (queryRequestBuilder != null) {
queryResponseList.setSolrQuery(queryRequestBuilder.toString());
}
queryResponseList.setExecTime(execTime);
return queryResponseList;
}
public boolean update(String id, String field, Object value) {
try {
return client.prepareUpdate(index, type, id).setDoc(field, value).execute().actionGet().isCreated();
@ -448,11 +373,182 @@ public class SearchClient {
}
}
public static class SearchConditionBuilder {
private SearchRequestBuilder searchRequestBuilder;
private String query;
private boolean administrativeAccess = false;
private String[] responseFields;
private int offset = Constants.DEFAULT_START_COUNT;
private int size = Constants.DEFAULT_PAGE_SIZE;
private GeoInfo geoInfo;
private FacetInfo facetInfo;
public static SearchConditionBuilder builder(SearchRequestBuilder searchRequestBuilder) {
return new SearchConditionBuilder(searchRequestBuilder);
}
SearchConditionBuilder(SearchRequestBuilder searchRequestBuilder) {
this.searchRequestBuilder = searchRequestBuilder;
}
public SearchConditionBuilder query(String query) {
this.query = query;
return this;
}
public SearchConditionBuilder administrativeAccess() {
this.administrativeAccess = true;
return this;
}
public SearchConditionBuilder responseFields(String[] responseFields) {
this.responseFields = responseFields;
return this;
}
public SearchConditionBuilder offset(int offset) {
this.offset = offset;
return this;
}
public SearchConditionBuilder size(int size) {
this.size = size;
return this;
}
public SearchConditionBuilder geoInfo(GeoInfo geoInfo) {
this.geoInfo = geoInfo;
return this;
}
public SearchConditionBuilder facetInfo(FacetInfo facetInfo) {
this.facetInfo = facetInfo;
return this;
}
public boolean build() {
if (offset > ComponentUtil.getQueryHelper().getMaxSearchResultOffset()) {
throw new ResultOffsetExceededException("The number of result size is exceeded.");
}
final SearchQuery searchQuery = ComponentUtil.getQueryHelper().build(query, administrativeAccess);
final String q = searchQuery.getQuery();
if (StringUtil.isBlank(q)) {
return false;
}
searchRequestBuilder.setFrom(offset).setSize(size);
if (responseFields != null) {
searchRequestBuilder.addFields(responseFields);
}
// sort
final SortField[] sortFields = searchQuery.getSortFields();
if (sortFields.length != 0) {
for (final SortField sortField : sortFields) {
FieldSortBuilder fieldSort = SortBuilders.fieldSort(sortField.getField());
if (Constants.DESC.equals(sortField.getOrder())) {
fieldSort.order(SortOrder.DESC);
} else {
fieldSort.order(SortOrder.ASC);
}
searchRequestBuilder.addSort(fieldSort);
}
} else if (ComponentUtil.getQueryHelper().hasDefaultSortFields()) {
for (final SortField sortField : ComponentUtil.getQueryHelper().getDefaultSortFields()) {
FieldSortBuilder fieldSort = SortBuilders.fieldSort(sortField.getField());
if (Constants.DESC.equals(sortField.getOrder())) {
fieldSort.order(SortOrder.DESC);
} else {
fieldSort.order(SortOrder.ASC);
}
searchRequestBuilder.addSort(fieldSort);
}
}
// highlighting
if (ComponentUtil.getQueryHelper().getHighlightingFields() != null
&& ComponentUtil.getQueryHelper().getHighlightingFields().length != 0) {
for (final String hf : ComponentUtil.getQueryHelper().getHighlightingFields()) {
searchRequestBuilder.addHighlightedField(hf, ComponentUtil.getQueryHelper().getHighlightSnippetSize());
}
}
// facets
if (facetInfo != null) {
if (facetInfo.field != null) {
for (final String f : facetInfo.field) {
if (ComponentUtil.getQueryHelper().isFacetField(f)) {
String encodedField = BaseEncoding.base64().encode(f.getBytes(Charsets.UTF_8));
TermsBuilder termsBuilder = AggregationBuilders.terms(Constants.FACET_FIELD_PREFIX + encodedField).field(f);
// TODO order
if (facetInfo.limit != null) {
// TODO
termsBuilder.size(Integer.parseInt(facetInfo.limit));
}
searchRequestBuilder.addAggregation(termsBuilder);
} else {
throw new FessSolrQueryException("Invalid facet field: " + f);
}
}
}
if (facetInfo.query != null) {
for (final String fq : facetInfo.query) {
final String facetQuery = ComponentUtil.getQueryHelper().buildFacetQuery(fq);
if (StringUtil.isNotBlank(facetQuery)) {
final String encodedFacetQuery = BaseEncoding.base64().encode(facetQuery.getBytes(Charsets.UTF_8));
FilterAggregationBuilder filterBuilder =
AggregationBuilders.filter(Constants.FACET_QUERY_PREFIX + encodedFacetQuery).filter(
FilterBuilders.queryFilter(QueryBuilders.queryStringQuery(facetQuery)));
// TODO order
if (facetInfo.limit != null) {
// TODO
// filterBuilder.size(Integer.parseInt(facetInfo .limit));
}
searchRequestBuilder.addAggregation(filterBuilder);
} else {
throw new FessSolrQueryException("Invalid facet query: " + facetQuery);
}
}
}
}
BoolFilterBuilder boolFilterBuilder = null;
// query
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery(q);
// filter query
if (searchQuery.hasFilterQueries()) {
if (boolFilterBuilder == null) {
boolFilterBuilder = FilterBuilders.boolFilter();
}
for (String filterQuery : searchQuery.getFilterQueries()) {
boolFilterBuilder.must(FilterBuilders.queryFilter(QueryBuilders.queryStringQuery(filterQuery)));
}
}
// geo
if (geoInfo != null && geoInfo.isAvailable()) {
if (boolFilterBuilder == null) {
boolFilterBuilder = FilterBuilders.boolFilter();
}
boolFilterBuilder.must(geoInfo.toFilterBuilder());
}
if (boolFilterBuilder != null) {
queryBuilder = QueryBuilders.filteredQuery(queryBuilder, boolFilterBuilder);
}
searchRequestBuilder.setQuery(queryBuilder);
return true;
}
}
public interface SearchCondition {
boolean build(SearchRequestBuilder queryRequestBuilder);
boolean build(SearchRequestBuilder searchRequestBuilder);
}
public interface SearchResult<T> {
T build(SearchRequestBuilder queryRequestBuilder, long execTime, Optional<SearchResponse> searchResponse);
T build(SearchRequestBuilder searchRequestBuilder, long execTime, Optional<SearchResponse> searchResponse);
}
}

View file

@ -32,4 +32,6 @@ public interface IndexUpdateCallback {
long getExecuteTime();
void commit();
}

View file

@ -252,6 +252,20 @@ public class FileListDataStoreImpl extends CsvDataStoreImpl {
return true;
}
@Override
public void commit() {
if (!deleteIdList.isEmpty()) {
final IndexingHelper indexingHelper = ComponentUtil.getIndexingHelper();
for (final String id : deleteIdList) {
indexingHelper.deleteDocument(indexUpdateCallback.getElasticsearchClient(), id);
}
if (logger.isDebugEnabled()) {
logger.debug("Deleted " + deleteIdList);
}
}
indexUpdateCallback.commit();
}
@Override
public void setElasticsearchClient(final SearchClient searchClient) {
indexUpdateCallback.setElasticsearchClient(searchClient);

View file

@ -120,6 +120,14 @@ public class IndexUpdateCallbackImpl implements IndexUpdateCallback {
}
@Override
public void commit() {
if (!docList.isEmpty()) {
final IndexingHelper indexingHelper = ComponentUtil.getIndexingHelper();
indexingHelper.sendDocuments(searchClient, docList);
}
}
protected void addClickCountField(final Map<String, Object> doc, final String url, final String clickCountField) {
final SearchLogHelper searchLogHelper = ComponentUtil.getSearchLogHelper();
final int count = searchLogHelper.getClickCount(url);

View file

@ -236,6 +236,7 @@ public class DataIndexHelper implements Serializable {
} catch (final Exception e) {
logger.error("Failed to process a data crawling: " + dataCrawlingConfig.getName(), e);
} finally {
indexUpdateCallback.commit();
deleteOldDocs();
}
}

View file

@ -24,6 +24,7 @@ import java.util.Map;
import org.codelibs.core.lang.StringUtil;
import org.codelibs.fess.client.SearchClient;
import org.codelibs.fess.client.SearchClient.SearchConditionBuilder;
import org.codelibs.fess.db.exentity.KeyMatch;
import org.codelibs.fess.service.KeyMatchService;
import org.codelibs.fess.util.ComponentUtil;
@ -84,8 +85,11 @@ public class KeyMatchHelper {
final SearchClient searchClient = ComponentUtil.getElasticsearchClient();
final FieldHelper fieldHelper = ComponentUtil.getFieldHelper();
final List<Map<String, Object>> documentList =
searchClient.getDocumentList(keyMatch.getQuery(), 0, keyMatch.getMaxSize(), null, null,
new String[] { fieldHelper.docIdField }, false);
searchClient.getDocumentList(
searchRequestBuilder -> {
return SearchConditionBuilder.builder(searchRequestBuilder).administrativeAccess().size(keyMatch.getMaxSize())
.responseFields(new String[] { fieldHelper.docIdField }).build();
}).get();
return documentList;
}

View file

@ -56,8 +56,6 @@ public class SystemHelper implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(SystemHelper.class);
private final Set<String> adminRoleSet = new HashSet<>();
private String[] crawlerJavaOptions = new String[] { "-Djava.awt.headless=true", "-server", "-Xmx512m", "-XX:MaxPermSize=128m",
@ -67,8 +65,6 @@ public class SystemHelper implements Serializable {
private String logFilePath = System.getProperty("fess.log.file");
private String solrHome = System.getProperty("solr.solr.home");
private String javaCommandPath = "java";
private String filterPathEncoding = Constants.UTF_8;
@ -219,14 +215,6 @@ public class SystemHelper implements Serializable {
this.crawlerJavaOptions = crawlerJavaOptions;
}
public String getSolrHome() {
return solrHome;
}
public void setSolrHome(final String solrHome) {
this.solrHome = solrHome;
}
public String getJavaCommandPath() {
return javaCommandPath;
}

View file

@ -237,15 +237,31 @@ public class CrawlJob {
buf.append("WEB-INF");
buf.append(File.separator);
buf.append("classes");
// target/classes
final String userDir = System.getProperty("user.dir");
final File targetClassesDir = new File(userDir, "target" + File.separator + "classes");
if (targetClassesDir.isDirectory()) {
buf.append(cpSeparator);
buf.append(targetClassesDir.getAbsolutePath());
}
// WEB-INF/lib
appendJarFile(cpSeparator, servletContext, buf, "/WEB-INF/lib", "WEB-INF" + File.separator + "lib" + File.separator);
appendJarFile(cpSeparator, buf, new File(servletContext.getRealPath("/WEB-INF/lib")), "WEB-INF/lib" + File.separator);
// WEB-INF/cmd/lib
appendJarFile(cpSeparator, servletContext, buf, "/WEB-INF/cmd/lib", "WEB-INF" + File.separator + "cmd" + File.separator + "lib"
appendJarFile(cpSeparator, buf, new File(servletContext.getRealPath("/WEB-INF/cmd/lib")), "WEB-INF/cmd" + File.separator + "lib"
+ File.separator);
final File targetLibDir =
new File(userDir, "target" + File.separator + "fess" + File.separator + "WEB-INF" + File.separator + "lib");
if (targetLibDir.isDirectory()) {
appendJarFile(cpSeparator, buf, targetLibDir, targetLibDir.getAbsolutePath() + File.separator);
}
crawlerCmdList.add(buf.toString());
String transportAddresses = System.getProperty(Constants.FESS_ES_TRANSPORT_ADDRESSES);
if (StringUtil.isNotBlank(transportAddresses)) {
crawlerCmdList.add("-D" + Constants.FESS_ES_TRANSPORT_ADDRESSES + "=" + transportAddresses);
}
crawlerCmdList.add("-Dfess.crawler.process=true");
crawlerCmdList.add("-Dsolr.solr.home=" + systemHelper.getSolrHome());
if (logFilePath == null) {
logFilePath = systemHelper.getLogFilePath();
}
@ -297,7 +313,7 @@ public class CrawlJob {
crawlerCmdList.add(Integer.toString(documentExpires));
}
final File baseDir = new File(servletContext.getRealPath("/"));
final File baseDir = new File(servletContext.getRealPath("/WEB-INF")).getParentFile();
if (logger.isInfoEnabled()) {
logger.info("Crawler: \nDirectory=" + baseDir + "\nOptions=" + crawlerCmdList);
@ -357,9 +373,7 @@ public class CrawlJob {
logger.warn("Could not delete a temp dir: " + ownTmpDir.getAbsolutePath());
}
protected void appendJarFile(final String cpSeparator, final ServletContext servletContext, final StringBuilder buf,
final String libDirPath, final String basePath) {
final File libDir = new File(servletContext.getRealPath(libDirPath));
protected void appendJarFile(final String cpSeparator, final StringBuilder buf, final File libDir, final String basePath) {
final File[] jarFiles = libDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(final File dir, final String name) {

View file

@ -57,6 +57,7 @@ import org.codelibs.fess.InvalidQueryException;
import org.codelibs.fess.ResultOffsetExceededException;
import org.codelibs.fess.UnsupportedSearchException;
import org.codelibs.fess.client.SearchClient;
import org.codelibs.fess.client.SearchClient.SearchConditionBuilder;
import org.codelibs.fess.db.allcommon.CDef;
import org.codelibs.fess.db.exentity.ClickLog;
import org.codelibs.fess.db.exentity.SearchLog;
@ -895,8 +896,12 @@ public class IndexAction {
final int pageNum = Integer.parseInt(indexForm.num);
try {
documentItems =
searchClient
.getDocumentList(query, pageStart, pageNum, indexForm.facet, indexForm.geo, queryHelper.getResponseFields());
searchClient.getDocumentList(
searchRequestBuilder -> {
return SearchConditionBuilder.builder(searchRequestBuilder).query(query).offset(pageStart).size(pageNum)
.facetInfo(indexForm.facet).geoInfo(indexForm.geo).responseFields(queryHelper.getResponseFields())
.build();
}).get();
} catch (final InvalidQueryException e) {
if (logger.isDebugEnabled()) {
logger.debug(e.getMessage(), e);

View file

@ -26,17 +26,22 @@ import javax.servlet.http.HttpServletRequest;
import org.codelibs.core.lang.StringUtil;
import org.codelibs.core.misc.DynamicProperties;
import org.codelibs.fess.Constants;
import org.codelibs.fess.InvalidQueryException;
import org.codelibs.fess.ResultOffsetExceededException;
import org.codelibs.fess.client.SearchClient;
import org.codelibs.fess.client.SearchClient.SearchConditionBuilder;
import org.codelibs.fess.crud.util.SAStrutsUtil;
import org.codelibs.fess.entity.SearchQuery;
import org.codelibs.fess.helper.FieldHelper;
import org.codelibs.fess.helper.JobHelper;
import org.codelibs.fess.helper.QueryHelper;
import org.codelibs.fess.helper.SystemHelper;
import org.codelibs.fess.util.ComponentUtil;
import org.codelibs.fess.util.QueryResponseList;
import org.codelibs.sastruts.core.annotation.Token;
import org.codelibs.sastruts.core.exception.SSCActionMessagesException;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.seasar.framework.beans.util.Beans;
@ -52,10 +57,6 @@ public class SearchListAction implements Serializable {
private static final long serialVersionUID = 1L;
protected static final int DEFAULT_PAGE_SIZE = 20;
protected static final long DEFAULT_START_COUNT = 0;
@ActionForm
@Resource
protected SearchListForm searchListForm;
@ -130,16 +131,16 @@ public class SearchListAction implements Serializable {
// init pager
if (StringUtil.isBlank(searchListForm.start)) {
searchListForm.start = String.valueOf(DEFAULT_START_COUNT);
searchListForm.start = String.valueOf(Constants.DEFAULT_START_COUNT);
} else {
try {
Long.parseLong(searchListForm.start);
} catch (final NumberFormatException e) {
searchListForm.start = String.valueOf(DEFAULT_START_COUNT);
searchListForm.start = String.valueOf(Constants.DEFAULT_START_COUNT);
}
}
if (StringUtil.isBlank(searchListForm.num)) {
searchListForm.num = String.valueOf(DEFAULT_PAGE_SIZE);
searchListForm.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE);
} else {
try {
final int num = Integer.parseInt(searchListForm.num);
@ -148,14 +149,19 @@ public class SearchListAction implements Serializable {
searchListForm.num = "100";
}
} catch (final NumberFormatException e) {
searchListForm.num = String.valueOf(DEFAULT_PAGE_SIZE);
searchListForm.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE);
}
}
final int offset = Integer.parseInt(searchListForm.start);
final int size = Integer.parseInt(searchListForm.num);
try {
documentItems = searchClient.getDocumentList(query, offset, size, null, null, queryHelper.getResponseFields(), false);
documentItems =
searchClient.getDocumentList(
searchRequestBuilder -> {
return SearchConditionBuilder.builder(searchRequestBuilder).administrativeAccess().offset(offset)
.size(size).responseFields(queryHelper.getResponseFields()).build();
}).get();
} catch (final InvalidQueryException e) {
if (logger.isDebugEnabled()) {
logger.debug(e.getMessage(), e);
@ -203,19 +209,19 @@ public class SearchListAction implements Serializable {
}
protected String doMove(final int move) {
int size = DEFAULT_PAGE_SIZE;
int size = Constants.DEFAULT_PAGE_SIZE;
if (StringUtil.isBlank(searchListForm.num)) {
searchListForm.num = String.valueOf(DEFAULT_PAGE_SIZE);
searchListForm.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE);
} else {
try {
size = Integer.parseInt(searchListForm.num);
} catch (final NumberFormatException e) {
searchListForm.num = String.valueOf(DEFAULT_PAGE_SIZE);
searchListForm.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE);
}
}
if (StringUtil.isBlank(searchListForm.pn)) {
searchListForm.start = String.valueOf(DEFAULT_START_COUNT);
searchListForm.start = String.valueOf(Constants.DEFAULT_START_COUNT);
} else {
Integer pageNumber = Integer.parseInt(searchListForm.pn);
if (pageNumber != null && pageNumber > 0) {
@ -225,7 +231,7 @@ public class SearchListAction implements Serializable {
}
searchListForm.start = String.valueOf((pageNumber - 1) * size);
} else {
searchListForm.start = String.valueOf(DEFAULT_START_COUNT);
searchListForm.start = String.valueOf(Constants.DEFAULT_START_COUNT);
}
}

View file

@ -17,10 +17,7 @@
package org.codelibs.fess.web.admin;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
@ -35,18 +32,13 @@ import org.codelibs.fess.helper.SystemHelper;
import org.codelibs.fess.helper.WebManagementHelper;
import org.codelibs.fess.service.ScheduledJobService;
import org.codelibs.sastruts.core.annotation.Token;
import org.codelibs.sastruts.core.exception.SSCActionMessagesException;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.RequestUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SystemAction implements Serializable {
private static final String STARTING_CRAWL_PROCESS = "startingCrawlProcess";
private static final Logger logger = LoggerFactory.getLogger(SystemAction.class);
private static final long serialVersionUID = 1L;
@ActionForm
@ -56,9 +48,6 @@ public class SystemAction implements Serializable {
@Resource
protected SearchClient searchClient;
@Resource
protected WebManagementHelper webManagementHelper;
@Resource
protected SystemHelper systemHelper;
@ -68,6 +57,10 @@ public class SystemAction implements Serializable {
@Resource
protected ScheduledJobService scheduledJobService;
public String clusterName;
public String clusterStatus;
public String getHelpLink() {
return systemHelper.getHelpLink("system");
}
@ -121,57 +114,6 @@ public class SystemAction implements Serializable {
return showIndex(true);
}
@Token(save = false, validate = true)
@Execute(validator = true, input = "index.jsp")
public String startSolrInstance() {
try {
webManagementHelper.start(systemForm.solrInstanceName);
SAStrutsUtil.addSessionMessage("success.starting_solr_instance");
} catch (final Exception e) {
logger.error("Failed to start a solr instance: " + systemForm.solrInstanceName, e);
throw new SSCActionMessagesException(e, "errors.failed_to_start_solr_instance");
}
return showIndex(true);
}
@Token(save = false, validate = true)
@Execute(validator = true, input = "index.jsp")
public String stopSolrInstance() {
try {
webManagementHelper.stop(systemForm.solrInstanceName);
SAStrutsUtil.addSessionMessage("success.stopping_solr_instance");
} catch (final Exception e) {
logger.error("Failed to stop a solr instance: " + systemForm.solrInstanceName, e);
throw new SSCActionMessagesException(e, "errors.failed_to_stop_solr_instance");
}
return showIndex(true);
}
@Token(save = false, validate = true)
@Execute(validator = true, input = "index.jsp")
public String reloadSolrInstance() {
try {
webManagementHelper.reload(systemForm.solrInstanceName);
SAStrutsUtil.addSessionMessage("success.reloading_solr_instance");
} catch (final Exception e) {
logger.error("Failed to reload a solr instance: " + systemForm.solrInstanceName, e);
throw new SSCActionMessagesException(e, "errors.failed_to_reload_solr_instance");
}
return showIndex(true);
}
public List<Map<String, String>> getSolrInstanceList() {
final List<String> solrInstanceNameList = webManagementHelper.getSolrInstanceNameList();
final List<Map<String, String>> solrInstanceList = new ArrayList<Map<String, String>>();
for (final String solrInstanceName : solrInstanceNameList) {
final Map<String, String> map = new HashMap<String, String>();
map.put("name", solrInstanceName);
map.put("status", webManagementHelper.getStatus(solrInstanceName));
solrInstanceList.add(map);
}
return solrInstanceList;
}
public boolean isCrawlerRunning() {
final HttpSession session = RequestUtil.getRequest().getSession(false);
if (session != null) {

View file

@ -17,9 +17,6 @@
package org.codelibs.fess.web.admin;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.seasar.struts.annotation.Required;
@ -27,25 +24,7 @@ public class SystemForm implements Serializable {
private static final long serialVersionUID = 1L;
public String currentServerForUpdate;
public String currentServerForSelect;
public String currentServerStatusForUpdate;
public String currentServerStatusForSelect;
public List<Map<String, String>> serverStatusList = new ArrayList<Map<String, String>>();
@Required(target = "commit,optimize,delete")
public String groupName;
@Required(target = "delete")
public String sessionId;
@Required(target = "deleteByUrl,confirmByUrl")
public String deleteUrl;
@Required(target = "startSolrInstance,stopSolrInstance,reloadSolrInstance")
public String solrInstanceName;
}

View file

@ -646,41 +646,40 @@ labels.overlapping_host_link_next_page=Next
# view/admin/solr/index.jsp
labels.system_title_configuration=System Configuration
labels.system_title_system_status=System Status
labels.solr_button_update=Update
labels.solr_active=Active
labels.solr_inactive=Inactive
labels.solr_ready=Ready
labels.solr_completed=Completed
labels.solr_unfinished=Unfinished
labels.solr_action_none=None
labels.solr_action_commit=Commit
labels.solr_action_optimize=Optimize
labels.solr_action_delete=Delete
labels.solr_action_confirm_list=Results
labels.solr_action_all=All
labels.solr_current_select_server=Current Select Server
labels.solr_current_update_server=Current Update Server
labels.solr_title_action=Solr Action
labels.solr_title_delete=Delete Docs From Index
labels.es_button_update=Update
labels.es_active=Active
labels.es_inactive=Inactive
labels.es_ready=Ready
labels.es_completed=Completed
labels.es_unfinished=Unfinished
labels.es_action_none=None
labels.es_action_commit=Commit
labels.es_action_optimize=Optimize
labels.es_action_delete=Delete
labels.es_action_confirm_list=Results
labels.es_action_all=All
labels.es_cluster_name=Cluster Name
labels.es_title_action=Solr Action
labels.es_title_delete=Delete Docs From Index
labels.crawler_process_running=Crawler Process
labels.crawler_running=Running
labels.crawler_stopped=Stopped
labels.crawler_process_action=Action
labels.solr_document_title=Added Docs
labels.solr_group_name=Server Group
labels.es_document_title=Added Docs
labels.es_group_name=Server Group
labels.session_name=Session
labels.solr_num_of_docs=Num of Docs
labels.solr_title_edit=Solr Status
labels.es_num_of_docs=Num of Docs
labels.es_title_edit=Solr Status
labels.crawler_button_start=Start Crawler
labels.crawler_button_stop=Stop Crawker
labels.solr_management_title=Solr Instance
labels.solr_instance_name=Name
labels.solr_instance_status=Status
labels.solr_instance_action=Action
labels.solr_instance_start=Start
labels.solr_instance_stop=Stop
labels.solr_instance_reload=Reload
labels.solr_action_url_delete=URL
labels.es_management_title=Solr Instance
labels.es_instance_name=Name
labels.es_instance_status=Status
labels.es_instance_action=Action
labels.es_instance_start=Start
labels.es_instance_stop=Stop
labels.es_instance_reload=Reload
labels.es_action_url_delete=URL
labels.system_document_all=All
labels.system_group_server_name=Group : Server
labels.system_server_status=Server Status

View file

@ -646,41 +646,40 @@ labels.overlapping_host_link_next_page=Next
# view/admin/solr/index.jsp
labels.system_title_configuration=System Configuration
labels.system_title_system_status=System Status
labels.solr_button_update=Update
labels.solr_active=Active
labels.solr_inactive=Inactive
labels.solr_ready=Ready
labels.solr_completed=Completed
labels.solr_unfinished=Unfinished
labels.solr_action_none=None
labels.solr_action_commit=Commit
labels.solr_action_optimize=Optimize
labels.solr_action_delete=Delete
labels.solr_action_confirm_list=Results
labels.solr_action_all=All
labels.solr_current_select_server=Current Select Server
labels.solr_current_update_server=Current Update Server
labels.solr_title_action=Solr Action
labels.solr_title_delete=Delete Docs From Index
labels.es_button_update=Update
labels.es_active=Active
labels.es_inactive=Inactive
labels.es_ready=Ready
labels.es_completed=Completed
labels.es_unfinished=Unfinished
labels.es_action_none=None
labels.es_action_commit=Commit
labels.es_action_optimize=Optimize
labels.es_action_delete=Delete
labels.es_action_confirm_list=Results
labels.es_action_all=All
labels.es_cluster_name=Cluster Name
labels.es_title_action=Solr Action
labels.es_title_delete=Delete Docs From Index
labels.crawler_process_running=Crawler Process
labels.crawler_running=Running
labels.crawler_stopped=Stopped
labels.crawler_process_action=Action
labels.solr_document_title=Added Docs
labels.solr_group_name=Server Group
labels.es_document_title=Added Docs
labels.es_group_name=Server Group
labels.session_name=Session
labels.solr_num_of_docs=Num of Docs
labels.solr_title_edit=Solr Status
labels.es_num_of_docs=Num of Docs
labels.es_title_edit=Solr Status
labels.crawler_button_start=Start Crawler
labels.crawler_button_stop=Stop Crawker
labels.solr_management_title=Solr Instance
labels.solr_instance_name=Name
labels.solr_instance_status=Status
labels.solr_instance_action=Action
labels.solr_instance_start=Start
labels.solr_instance_stop=Stop
labels.solr_instance_reload=Reload
labels.solr_action_url_delete=URL
labels.es_management_title=Solr Instance
labels.es_instance_name=Name
labels.es_instance_status=Status
labels.es_instance_action=Action
labels.es_instance_start=Start
labels.es_instance_stop=Stop
labels.es_instance_reload=Reload
labels.es_action_url_delete=URL
labels.system_document_all=All
labels.system_group_server_name=Group : Server
labels.system_server_status=Server Status

View file

@ -646,41 +646,40 @@ labels.overlapping_host_link_next_page=\u6b21\u3078
# view/admin/solr/index.jsp
labels.system_title_configuration=\u30b7\u30b9\u30c6\u30e0\u8a2d\u5b9a
labels.system_title_system_status=\u30b7\u30b9\u30c6\u30e0\u72b6\u614b
labels.solr_button_update=\u66f4\u65b0
labels.solr_active=\u6709\u52b9
labels.solr_inactive=\u7121\u52b9
labels.solr_ready=\u6e96\u5099\u4e2d
labels.solr_completed=\u5b8c\u4e86
labels.solr_unfinished=\u672a\u5b8c\u4e86
labels.solr_action_none=\u306a\u3057
labels.solr_action_commit=\u30b3\u30df\u30c3\u30c8
labels.solr_action_optimize=\u6700\u9069\u5316
labels.solr_action_delete=\u524a\u9664
labels.solr_action_confirm_list=\u7d50\u679c\u4e00\u89a7
labels.solr_action_all=\u3059\u3079\u3066
labels.solr_current_select_server=\u73fe\u5728\u306e\u691c\u7d22\u7528\u30b5\u30fc\u30d0\u30fc
labels.solr_current_update_server=\u73fe\u5728\u306e\u66f4\u65b0\u7528\u30b5\u30fc\u30d0\u30fc
labels.solr_title_action=Solr \u30a2\u30af\u30b7\u30e7\u30f3
labels.solr_title_delete=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u524a\u9664
labels.es_button_update=\u66f4\u65b0
labels.es_active=\u6709\u52b9
labels.es_inactive=\u7121\u52b9
labels.es_ready=\u6e96\u5099\u4e2d
labels.es_completed=\u5b8c\u4e86
labels.es_unfinished=\u672a\u5b8c\u4e86
labels.es_action_none=\u306a\u3057
labels.es_action_commit=\u30b3\u30df\u30c3\u30c8
labels.es_action_optimize=\u6700\u9069\u5316
labels.es_action_delete=\u524a\u9664
labels.es_action_confirm_list=\u7d50\u679c\u4e00\u89a7
labels.es_action_all=\u3059\u3079\u3066
labels.es_cluster_name=\u30af\u30e9\u30b9\u30bf\u540d
labels.es_title_action=Solr \u30a2\u30af\u30b7\u30e7\u30f3
labels.es_title_delete=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u524a\u9664
labels.crawler_process_running=\u30af\u30ed\u30fc\u30e9\u30fc\u30d7\u30ed\u30bb\u30b9
labels.crawler_running=\u5b9f\u884c\u4e2d
labels.crawler_stopped=\u505c\u6b62\u4e2d
labels.crawler_process_action=\u30a2\u30af\u30b7\u30e7\u30f3
labels.solr_document_title=\u8ffd\u52a0\u3055\u308c\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8
labels.solr_group_name=\u30b5\u30fc\u30d0\u30fc\u30b0\u30eb\u30fc\u30d7
labels.es_document_title=\u8ffd\u52a0\u3055\u308c\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8
labels.es_group_name=\u30b5\u30fc\u30d0\u30fc\u30b0\u30eb\u30fc\u30d7
labels.session_name=\u30bb\u30c3\u30b7\u30e7\u30f3
labels.solr_num_of_docs=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u6570
labels.solr_title_edit=Solr \u72b6\u614b\u8a2d\u5b9a
labels.es_num_of_docs=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u6570
labels.es_title_edit=Solr \u72b6\u614b\u8a2d\u5b9a
labels.crawler_button_start=\u30af\u30ed\u30fc\u30eb\u306e\u958b\u59cb
labels.crawler_button_stop=\u30af\u30ed\u30fc\u30eb\u306e\u505c\u6b62
labels.solr_management_title=Solr\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9
labels.solr_instance_name=\u540d\u524d
labels.solr_instance_status=\u72b6\u614b
labels.solr_instance_action=\u30a2\u30af\u30b7\u30e7\u30f3
labels.solr_instance_start=\u8d77\u52d5
labels.solr_instance_stop=\u505c\u6b62
labels.solr_instance_reload=\u30ea\u30ed\u30fc\u30c9
labels.solr_action_url_delete=URL
labels.es_management_title=Solr\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9
labels.es_instance_name=\u540d\u524d
labels.es_instance_status=\u72b6\u614b
labels.es_instance_action=\u30a2\u30af\u30b7\u30e7\u30f3
labels.es_instance_start=\u8d77\u52d5
labels.es_instance_stop=\u505c\u6b62
labels.es_instance_reload=\u30ea\u30ed\u30fc\u30c9
labels.es_action_url_delete=URL
labels.system_document_all=\u3059\u3079\u3066
labels.system_group_server_name=\u30b0\u30eb\u30fc\u30d7 : \u30b5\u30fc\u30d0\u30fc
labels.system_server_status=\u30b5\u30fc\u30d0\u30fc\u72b6\u614b

View file

@ -42,24 +42,6 @@
@System@getProperty("fess.log.file").replaceAll(".out", "_crawler.out")
</property>
<property name="crawlerJavaOptions">
@System@getProperty("java.version").startsWith("1.7") ?
new String[] {
"-Djava.awt.headless=true",
"-server",
"-Xmx256m",
"-XX:MaxPermSize=128m",
"-XX:-UseGCOverheadLimit",
"-XX:+UseConcMarkSweepGC",
"-XX:CMSInitiatingOccupancyFraction=75",
"-XX:+CMSIncrementalMode",
"-XX:+CMSIncrementalPacing",
"-XX:CMSIncrementalDutyCycleMin=0",
"-XX:+UseParNewGC",
"-XX:+UseStringCache",
"-XX:+UseTLAB",
"-XX:+DisableExplicitGC"
}
:
new String[] {
"-Djava.awt.headless=true",
"-server",

View file

@ -3,5 +3,8 @@
"http://www.seasar.org/dtd/components24.dtd">
<components>
<component name="searchClient" class="org.codelibs.fess.client.SearchClient">
<property name="settings">
#{"http.cors.enabled" : "true"}
</property>
</component>
</components>

View file

@ -4,6 +4,7 @@
<components>
<include path="convention.dicon" />
<include path="aop.dicon" />
<include path="saflute.dicon"/>
<include path="dbflute.dicon" />
<include path="fess.dicon" />

View file

@ -26,7 +26,7 @@
<c:if test="${!empty groupActionItems}">
<div>
<h3>
<bean:message key="labels.solr_title_action" />
<bean:message key="labels.es_title_action" />
</h3>
<table class="bordered-table zebra-striped">
<tbody>
@ -40,11 +40,11 @@
<html:submit
property="commit" disabled="${solrProcessRunning}"
styleClass="btn">
<bean:message key="labels.solr_action_commit" />
<bean:message key="labels.es_action_commit" />
</html:submit>
<html:submit property="optimize"
disabled="${solrProcessRunning}" styleClass="btn">
<bean:message key="labels.solr_action_optimize" />
<bean:message key="labels.es_action_optimize" />
</html:submit>
</td>
</tr>
@ -56,7 +56,7 @@
<div style="margin-top: 5px;">
<h3>
<bean:message key="labels.solr_title_delete" />
<bean:message key="labels.es_title_delete" />
</h3>
<table class="bordered-table zebra-striped">
<tbody>
@ -68,18 +68,18 @@
<html:select property="sessionId"
disabled="${solrProcessRunning}">
<html:option value="">
<bean:message key="labels.solr_action_none" />
<bean:message key="labels.es_action_none" />
</html:option>
<c:forEach var="sessionIdItem"
items="${groupAction.sessionIdItems}">
<html:option value="${f:u(sessionIdItem.value)}">${f:h(sessionIdItem.label)}</html:option>
</c:forEach>
<html:option value="*">
<bean:message key="labels.solr_action_all" /> (${f:h(groupAction.totalCount)})</html:option>
<bean:message key="labels.es_action_all" /> (${f:h(groupAction.totalCount)})</html:option>
</html:select>
<html:submit styleClass="btn" property="delete"
disabled="${solrProcessRunning}">
<bean:message key="labels.solr_action_delete" />
<bean:message key="labels.es_action_delete" />
</html:submit>
<html:hidden property="groupName"
value="${f:u(groupAction.groupName)}" />
@ -87,16 +87,16 @@
</tr>
<tr>
<td style="vertical-align: middle;">
<bean:message key="labels.solr_action_url_delete" />
<bean:message key="labels.es_action_url_delete" />
<html:text property="deleteUrl" style="width:150px;"
disabled="${solrProcessRunning}"></html:text> <html:submit
property="confirmByUrl" styleClass="btn"
disabled="${solrProcessRunning}">
<bean:message key="labels.solr_action_confirm_list" />
<bean:message key="labels.es_action_confirm_list" />
</html:submit>
<html:submit property="deleteByUrl"
disabled="${solrProcessRunning}" styleClass="btn">
<bean:message key="labels.solr_action_delete" />
<bean:message key="labels.es_action_delete" />
</html:submit>
</td>
</tr>
@ -108,14 +108,14 @@
<div style="margin-top: 5px;">
<h3>
<bean:message key="labels.solr_document_title" />
<bean:message key="labels.es_document_title" />
</h3>
<table class="bordered-table zebra-striped">
<thead>
<tr>
<th style="width:200px;"><bean:message key="labels.solr_group_name" /></th>
<th style="width:200px;"><bean:message key="labels.es_group_name" /></th>
<th><bean:message key="labels.session_name" /></th>
<th><bean:message key="labels.solr_num_of_docs" /></th>
<th><bean:message key="labels.es_num_of_docs" /></th>
</tr>
</thead>
<tbody>
@ -149,7 +149,7 @@
<thead>
<tr>
<th style="width:200px;"><bean:message key="labels.suggest_type" /></th>
<th><bean:message key="labels.solr_num_of_docs" /></th>
<th><bean:message key="labels.es_num_of_docs" /></th>
<th></th>
</tr>
</thead>
@ -169,7 +169,7 @@
value="content" />
<html:submit styleClass="btn" property="deleteSuggest"
disabled="${solrProcessRunning}">
<bean:message key="labels.solr_action_delete" />
<bean:message key="labels.es_action_delete" />
</html:submit>
</s:form>
</td>
@ -183,7 +183,7 @@
value="searchLog" />
<html:submit styleClass="btn" property="deleteSuggest"
disabled="${solrProcessRunning}">
<bean:message key="labels.solr_action_delete" />
<bean:message key="labels.es_action_delete" />
</html:submit>
</s:form>
</td>

View file

@ -27,24 +27,13 @@
<table class="bordered-table zebra-striped">
<tbody>
<tr>
<th><bean:message key="labels.solr_current_select_server" />
<th><bean:message key="labels.es_cluster_name" />
</th>
<td>${f:h(currentServerForSelect)} (<c:if
test="${currentServerStatusForSelect=='ACTIVE'}">
<bean:message key="labels.solr_active" />
</c:if> <c:if test="${currentServerStatusForSelect!='ACTIVE'}">
<bean:message key="labels.solr_inactive" />
</c:if>)
</td>
</tr>
<tr>
<th><bean:message key="labels.solr_current_update_server" />
</th>
<td>${f:h(currentServerForUpdate)} (<c:if
test="${currentServerStatusForUpdate=='ACTIVE'}">
<bean:message key="labels.solr_active" />
</c:if> <c:if test="${currentServerStatusForUpdate!='ACTIVE'}">
<bean:message key="labels.solr_inactive" />
<td>${f:h(clusterName)} (<c:if
test="${clusterStatus=='ACTIVE'}">
<bean:message key="labels.es_active" />
</c:if> <c:if test="${clusterStatus!='ACTIVE'}">
<bean:message key="labels.es_inactive" />
</c:if>)
</td>
</tr>
@ -97,113 +86,6 @@
</div>
</s:form>
<s:form>
<div style="margin-top: 5px;">
<h3>
<bean:message key="labels.solr_title_edit" />
</h3>
<table class="bordered-table zebra-striped">
<thead>
<tr>
<th><bean:message key="labels.system_group_server_name" /></th>
<th><bean:message key="labels.system_server_status" /></th>
<th><bean:message key="labels.system_index_status" /></th>
</tr>
</thead>
<tbody>
<c:forEach var="serverStatus" items="${serverStatusList}">
<tr>
<td style="width: 200px;">
${f:h(serverStatus.groupName)}
:
${f:h(serverStatus.serverName)}
</td>
<td>
<html:select name="serverStatusList"
property="${serverStatus.groupName}/${serverStatus.serverName}/status"
value="${serverStatus.status}" indexed="true" style="width:100px">
<html:option value="active">
<bean:message key="labels.solr_active" />
</html:option>
<html:option value="inactive">
<bean:message key="labels.solr_inactive" />
</html:option>
</html:select>
</td>
<td>
<html:select name="serverStatusList"
property="${serverStatus.groupName}/${serverStatus.serverName}/index"
value="${serverStatus.index}" indexed="true" style="width:100px">
<html:option value="ready">
<bean:message key="labels.solr_ready" />
</html:option>
<html:option value="completed">
<bean:message key="labels.solr_completed" />
</html:option>
<html:option value="unfinished">
<bean:message key="labels.solr_unfinished" />
</html:option>
</html:select>
</td>
</tr>
</c:forEach>
</tbody>
<tfoot>
<tr>
<td colspan="3"><input type="submit" class="btn"
name="update"
value="<bean:message key="labels.solr_button_update"/>" /></td>
</tr>
</tfoot>
</table>
</div>
</s:form>
<div style="margin-top: 5px;">
<h3>
<bean:message key="labels.solr_management_title" />
</h3>
<table class="bordered-table zebra-striped">
<tbody>
<tr>
<th style="width: 200px;"><bean:message
key="labels.solr_instance_name" /></th>
<th style="width: 100px;"><bean:message
key="labels.solr_instance_status" /></th>
<th><bean:message key="labels.solr_instance_action" /></th>
</tr>
<c:forEach var="solrInstance" items="${solrInstanceList}">
<tr>
<td>${f:h(solrInstance.name)}</td>
<td style="text-align: center;">
${f:h(solrInstance.status)}</td>
<td style="text-align: center;"><s:form style="margin-bottom:0;">
<input type="hidden" name="solrInstanceName"
value="${f:h(solrInstance.name)}" />
<c:if test="${solrInstance.status!='running'}">
<html:submit styleClass="btn" property="startSolrInstance"
disabled="${crawlerRunning}">
<bean:message key="labels.solr_instance_start" />
</html:submit>
</c:if>
<c:if test="${solrInstance.status=='running'}">
<html:submit property="stopSolrInstance"
disabled="${crawlerRunning}" styleClass="btn">
<bean:message key="labels.solr_instance_stop" />
</html:submit>
<html:submit property="reloadSolrInstance"
disabled="${crawlerRunning}" styleClass="btn">
<bean:message key="labels.solr_instance_reload" />
</html:submit>
</c:if>
</s:form></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
<c:if test="${crawlerRunning}">
<script type="text/javascript">