This commit is contained in:
parent
db1fa4b72f
commit
55115343b0
22 changed files with 452 additions and 521 deletions
5
pom.xml
5
pom.xml
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,4 +32,6 @@ public interface IndexUpdateCallback {
|
|||
|
||||
long getExecuteTime();
|
||||
|
||||
void commit();
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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" />
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Add table
Reference in a new issue