fix #2240 add highlight parameters

This commit is contained in:
Shinsuke Sugaya 2019-09-07 06:54:06 +09:00
parent 8a44c88af9
commit c12d370a10
6 changed files with 377 additions and 80 deletions

View file

@ -22,12 +22,14 @@ public class HighlightInfo {
private String type;
private int fragmentSize;
private int numOfFragments;
private int fragmentOffset;
public HighlightInfo() {
final FessConfig fessConfig = ComponentUtil.getFessConfig();
this.type = fessConfig.getQueryHighlightType();
this.fragmentSize = fessConfig.getQueryHighlightFragmentSizeAsInteger();
this.numOfFragments = fessConfig.getQueryHighlightNumberOfFragmentsAsInteger();
this.fragmentOffset = fessConfig.getQueryHighlightFragmentOffsetAsInteger();
}
public String getType() {
@ -56,4 +58,13 @@ public class HighlightInfo {
this.numOfFragments = numOfFragments;
return this;
}
public int getFragmentOffset() {
return fragmentOffset;
}
public HighlightInfo fragmentOffset(final int fragmentOffset) {
this.fragmentOffset = fragmentOffset;
return this;
}
}

View file

@ -1108,8 +1108,116 @@ public class FessEsClient implements Client {
throw new ResultOffsetExceededException("The number of result size is exceeded.");
}
final QueryContext queryContext =
queryHelper.build(searchRequestType, query, context -> {
final QueryContext queryContext = buildQueryContext(queryHelper, fessConfig);
searchRequestBuilder.setFrom(offset).setSize(size);
final Object trackTotalHitsValue = fessConfig.getQueryTrackTotalHitsValue();
if (trackTotalHitsValue instanceof Boolean) {
searchRequestBuilder.setTrackTotalHits((Boolean) trackTotalHitsValue);
} else if (trackTotalHitsValue instanceof Number) {
searchRequestBuilder.setTrackTotalHitsUpTo(((Number) trackTotalHitsValue).intValue());
}
if (responseFields != null) {
searchRequestBuilder.setFetchSource(responseFields, null);
}
// rescorer
buildRescorer(queryHelper, fessConfig);
// sort
buildSort(queryContext, fessConfig);
// highlighting
if (highlightInfo != null) {
buildHighlighter(queryHelper, fessConfig);
}
// facets
if (facetInfo != null) {
buildFacet(queryHelper, fessConfig);
}
if (!SearchRequestType.ADMIN_SEARCH.equals(searchRequestType) && !isScroll && fessConfig.isResultCollapsed()
&& similarDocHash == null) {
searchRequestBuilder.setCollapse(getCollapseBuilder(fessConfig));
}
searchRequestBuilder.setQuery(queryContext.getQueryBuilder());
return true;
}
protected void buildFacet(final QueryHelper queryHelper, final FessConfig fessConfig) {
stream(facetInfo.field).of(
stream -> stream.forEach(f -> {
if (queryHelper.isFacetField(f)) {
final String encodedField = BaseEncoding.base64().encode(f.getBytes(StandardCharsets.UTF_8));
final TermsAggregationBuilder termsBuilder =
AggregationBuilders.terms(Constants.FACET_FIELD_PREFIX + encodedField).field(f);
termsBuilder.order(facetInfo.getBucketOrder());
if (facetInfo.size != null) {
termsBuilder.size(facetInfo.size);
}
if (facetInfo.minDocCount != null) {
termsBuilder.minDocCount(facetInfo.minDocCount);
}
if (facetInfo.missing != null) {
termsBuilder.missing(facetInfo.missing);
}
searchRequestBuilder.addAggregation(termsBuilder);
} else {
throw new SearchQueryException("Invalid facet field: " + f);
}
}));
stream(facetInfo.query)
.of(stream -> stream.forEach(fq -> {
final QueryContext facetContext = new QueryContext(fq, false);
queryHelper.buildBaseQuery(facetContext, c -> {});
final String encodedFacetQuery = BaseEncoding.base64().encode(fq.getBytes(StandardCharsets.UTF_8));
final FilterAggregationBuilder filterBuilder =
AggregationBuilders.filter(Constants.FACET_QUERY_PREFIX + encodedFacetQuery, facetContext.getQueryBuilder());
searchRequestBuilder.addAggregation(filterBuilder);
}));
}
protected void buildHighlighter(final QueryHelper queryHelper, final FessConfig fessConfig) {
final String highlighterType = highlightInfo.getType();
final int fragmentSize = highlightInfo.getFragmentSize();
final int numOfFragments = highlightInfo.getNumOfFragments();
final int fragmentOffset = highlightInfo.getFragmentOffset();
final char[] boundaryChars = fessConfig.getQueryHighlightBoundaryCharsAsArray();
final int boundaryMaxScan = fessConfig.getQueryHighlightBoundaryMaxScanAsInteger();
final String boundaryScannerType = fessConfig.getQueryHighlightBoundaryScanner();
final boolean forceSource = fessConfig.isQueryHighlightForceSource();
final String fragmenter = fessConfig.getQueryHighlightFragmenter();
final int noMatchSize = fessConfig.getQueryHighlightNoMatchSizeAsInteger();
final String order = fessConfig.getQueryHighlightOrder();
final int phraseLimit = fessConfig.getQueryHighlightPhraseLimitAsInteger();
final String encoder = fessConfig.getQueryHighlightEncoder();
final HighlightBuilder highlightBuilder = new HighlightBuilder();
queryHelper.highlightedFields(stream -> stream.forEach(hf -> highlightBuilder.field(
new HighlightBuilder.Field(hf).highlighterType(highlighterType).fragmentSize(fragmentSize)
.numOfFragments(numOfFragments).boundaryChars(boundaryChars).boundaryMaxScan(boundaryMaxScan)
.boundaryScannerType(boundaryScannerType).forceSource(forceSource).fragmenter(fragmenter)
.fragmentOffset(fragmentOffset).noMatchSize(noMatchSize).order(order).phraseLimit(phraseLimit))
.encoder(encoder)));
searchRequestBuilder.highlighter(highlightBuilder);
}
protected void buildSort(final QueryContext queryContext, final FessConfig fessConfig) {
queryContext.sortBuilders().forEach(sortBuilder -> searchRequestBuilder.addSort(sortBuilder));
}
protected void buildRescorer(final QueryHelper queryHelper, final FessConfig fessConfig) {
stream(queryHelper.getRescorers(condition())).of(stream -> stream.forEach(searchRequestBuilder::addRescorer));
}
protected QueryContext buildQueryContext(final QueryHelper queryHelper, final FessConfig fessConfig) {
return queryHelper.build(
searchRequestType,
query,
context -> {
if (SearchRequestType.ADMIN_SEARCH.equals(searchRequestType)) {
context.skipRoleQuery();
} else if (similarDocHash != null) {
@ -1126,77 +1234,6 @@ public class FessEsClient implements Client {
});
}
});
searchRequestBuilder.setFrom(offset).setSize(size);
final Object trackTotalHitsValue = fessConfig.getQueryTrackTotalHitsValue();
if (trackTotalHitsValue instanceof Boolean) {
searchRequestBuilder.setTrackTotalHits((Boolean) trackTotalHitsValue);
} else if (trackTotalHitsValue instanceof Number) {
searchRequestBuilder.setTrackTotalHitsUpTo(((Number) trackTotalHitsValue).intValue());
}
if (responseFields != null) {
searchRequestBuilder.setFetchSource(responseFields, null);
}
// rescorer
stream(queryHelper.getRescorers(condition())).of(stream -> stream.forEach(searchRequestBuilder::addRescorer));
// sort
queryContext.sortBuilders().forEach(sortBuilder -> searchRequestBuilder.addSort(sortBuilder));
// highlighting
if (highlightInfo != null) {
final HighlightBuilder highlightBuilder = new HighlightBuilder();
queryHelper.highlightedFields(stream -> stream.forEach(hf -> highlightBuilder.field(new HighlightBuilder.Field(hf)
.highlighterType(highlightInfo.getType()).fragmentSize(highlightInfo.getFragmentSize())
.numOfFragments(highlightInfo.getNumOfFragments()))));
searchRequestBuilder.highlighter(highlightBuilder);
}
// facets
if (facetInfo != null) {
stream(facetInfo.field).of(
stream -> stream.forEach(f -> {
if (queryHelper.isFacetField(f)) {
final String encodedField = BaseEncoding.base64().encode(f.getBytes(StandardCharsets.UTF_8));
final TermsAggregationBuilder termsBuilder =
AggregationBuilders.terms(Constants.FACET_FIELD_PREFIX + encodedField).field(f);
termsBuilder.order(facetInfo.getBucketOrder());
if (facetInfo.size != null) {
termsBuilder.size(facetInfo.size);
}
if (facetInfo.minDocCount != null) {
termsBuilder.minDocCount(facetInfo.minDocCount);
}
if (facetInfo.missing != null) {
termsBuilder.missing(facetInfo.missing);
}
searchRequestBuilder.addAggregation(termsBuilder);
} else {
throw new SearchQueryException("Invalid facet field: " + f);
}
}));
stream(facetInfo.query).of(
stream -> stream.forEach(fq -> {
final QueryContext facetContext = new QueryContext(fq, false);
queryHelper.buildBaseQuery(facetContext, c -> {});
final String encodedFacetQuery = BaseEncoding.base64().encode(fq.getBytes(StandardCharsets.UTF_8));
final FilterAggregationBuilder filterBuilder =
AggregationBuilders.filter(Constants.FACET_QUERY_PREFIX + encodedFacetQuery,
facetContext.getQueryBuilder());
searchRequestBuilder.addAggregation(filterBuilder);
}));
}
if (!SearchRequestType.ADMIN_SEARCH.equals(searchRequestType) && !isScroll && fessConfig.isResultCollapsed()
&& similarDocHash == null) {
searchRequestBuilder.setCollapse(getCollapseBuilder(fessConfig));
}
searchRequestBuilder.setQuery(queryContext.getQueryBuilder());
return true;
}
protected CollapseBuilder getCollapseBuilder(final FessConfig fessConfig) {

View file

@ -67,7 +67,7 @@ public interface CrawlingConfig {
public enum ConfigType {
WEB("W"), FILE("F"), DATA("D");
private String typePrefix;
private final String typePrefix;
ConfigType(final String typePrefix) {
this.typePrefix = typePrefix;

View file

@ -83,7 +83,7 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
-Djna.nosys=true
-Djdk.io.permissionsUseCanonicalPath=true
-server
-Xms256m
-Xms128m
-Xmx256m
-XX:MaxMetaspaceSize=128m
-XX:CompressedClassSpaceSize=32m
@ -114,7 +114,7 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
-Djdk.io.permissionsUseCanonicalPath=true
-server
-Xms128m
-Xmx128m
-Xmx256m
-XX:MaxMetaspaceSize=128m
-XX:CompressedClassSpaceSize=32m
-XX:-UseGCOverheadLimit
@ -675,6 +675,36 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
/** The key of the configuration. e.g. </strong> */
String QUERY_HIGHLIGHT_TAG_POST = "query.highlight.tag.post";
/** The key of the configuration. e.g. */
String QUERY_HIGHLIGHT_BOUNDARY_CHARS = "query.highlight.boundary.chars";
/** The key of the configuration. e.g. 20 */
String QUERY_HIGHLIGHT_BOUNDARY_MAX_SCAN = "query.highlight.boundary.max.scan";
/** The key of the configuration. e.g. sentence */
String QUERY_HIGHLIGHT_BOUNDARY_SCANNER = "query.highlight.boundary.scanner";
/** The key of the configuration. e.g. default */
String QUERY_HIGHLIGHT_ENCODER = "query.highlight.encoder";
/** The key of the configuration. e.g. false */
String QUERY_HIGHLIGHT_FORCE_SOURCE = "query.highlight.force.source";
/** The key of the configuration. e.g. span */
String QUERY_HIGHLIGHT_FRAGMENTER = "query.highlight.fragmenter";
/** The key of the configuration. e.g. -1 */
String QUERY_HIGHLIGHT_FRAGMENT_OFFSET = "query.highlight.fragment.offset";
/** The key of the configuration. e.g. 0 */
String QUERY_HIGHLIGHT_NO_MATCH_SIZE = "query.highlight.no.match.size";
/** The key of the configuration. e.g. score */
String QUERY_HIGHLIGHT_ORDER = "query.highlight.order";
/** The key of the configuration. e.g. 256 */
String QUERY_HIGHLIGHT_PHRASE_LIMIT = "query.highlight.phrase.limit";
/** The key of the configuration. e.g. hl_content,digest */
String QUERY_HIGHLIGHT_CONTENT_DESCRIPTION_FIELDS = "query.highlight.content.description.fields";
@ -1543,7 +1573,7 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
-Djna.nosys=true
-Djdk.io.permissionsUseCanonicalPath=true
-server
-Xms256m
-Xms128m
-Xmx256m
-XX:MaxMetaspaceSize=128m
-XX:CompressedClassSpaceSize=32m
@ -1578,7 +1608,7 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
-Djdk.io.permissionsUseCanonicalPath=true
-server
-Xms128m
-Xmx128m
-Xmx256m
-XX:MaxMetaspaceSize=128m
-XX:CompressedClassSpaceSize=32m
-XX:-UseGCOverheadLimit
@ -3422,6 +3452,123 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
*/
String getQueryHighlightTagPost();
/**
* Get the value for the key 'query.highlight.boundary.chars'. <br>
* The value is, e.g. <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightBoundaryChars();
/**
* Get the value for the key 'query.highlight.boundary.chars' as {@link Integer}. <br>
* The value is, e.g. <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
* @throws NumberFormatException When the property is not integer.
*/
Integer getQueryHighlightBoundaryCharsAsInteger();
/**
* Get the value for the key 'query.highlight.boundary.max.scan'. <br>
* The value is, e.g. 20 <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightBoundaryMaxScan();
/**
* Get the value for the key 'query.highlight.boundary.max.scan' as {@link Integer}. <br>
* The value is, e.g. 20 <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
* @throws NumberFormatException When the property is not integer.
*/
Integer getQueryHighlightBoundaryMaxScanAsInteger();
/**
* Get the value for the key 'query.highlight.boundary.scanner'. <br>
* The value is, e.g. sentence <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightBoundaryScanner();
/**
* Get the value for the key 'query.highlight.encoder'. <br>
* The value is, e.g. default <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightEncoder();
/**
* Get the value for the key 'query.highlight.force.source'. <br>
* The value is, e.g. false <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightForceSource();
/**
* Is the property for the key 'query.highlight.force.source' true? <br>
* The value is, e.g. false <br>
* @return The determination, true or false. (if not found, exception but basically no way)
*/
boolean isQueryHighlightForceSource();
/**
* Get the value for the key 'query.highlight.fragmenter'. <br>
* The value is, e.g. span <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightFragmenter();
/**
* Get the value for the key 'query.highlight.fragment.offset'. <br>
* The value is, e.g. -1 <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightFragmentOffset();
/**
* Get the value for the key 'query.highlight.fragment.offset' as {@link Integer}. <br>
* The value is, e.g. -1 <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
* @throws NumberFormatException When the property is not integer.
*/
Integer getQueryHighlightFragmentOffsetAsInteger();
/**
* Get the value for the key 'query.highlight.no.match.size'. <br>
* The value is, e.g. 0 <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightNoMatchSize();
/**
* Get the value for the key 'query.highlight.no.match.size' as {@link Integer}. <br>
* The value is, e.g. 0 <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
* @throws NumberFormatException When the property is not integer.
*/
Integer getQueryHighlightNoMatchSizeAsInteger();
/**
* Get the value for the key 'query.highlight.order'. <br>
* The value is, e.g. score <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightOrder();
/**
* Get the value for the key 'query.highlight.phrase.limit'. <br>
* The value is, e.g. 256 <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryHighlightPhraseLimit();
/**
* Get the value for the key 'query.highlight.phrase.limit' as {@link Integer}. <br>
* The value is, e.g. 256 <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
* @throws NumberFormatException When the property is not integer.
*/
Integer getQueryHighlightPhraseLimitAsInteger();
/**
* Get the value for the key 'query.highlight.content.description.fields'. <br>
* The value is, e.g. hl_content,digest <br>
@ -6992,6 +7139,70 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
return get(FessConfig.QUERY_HIGHLIGHT_TAG_POST);
}
public String getQueryHighlightBoundaryChars() {
return get(FessConfig.QUERY_HIGHLIGHT_BOUNDARY_CHARS);
}
public Integer getQueryHighlightBoundaryCharsAsInteger() {
return getAsInteger(FessConfig.QUERY_HIGHLIGHT_BOUNDARY_CHARS);
}
public String getQueryHighlightBoundaryMaxScan() {
return get(FessConfig.QUERY_HIGHLIGHT_BOUNDARY_MAX_SCAN);
}
public Integer getQueryHighlightBoundaryMaxScanAsInteger() {
return getAsInteger(FessConfig.QUERY_HIGHLIGHT_BOUNDARY_MAX_SCAN);
}
public String getQueryHighlightBoundaryScanner() {
return get(FessConfig.QUERY_HIGHLIGHT_BOUNDARY_SCANNER);
}
public String getQueryHighlightEncoder() {
return get(FessConfig.QUERY_HIGHLIGHT_ENCODER);
}
public String getQueryHighlightForceSource() {
return get(FessConfig.QUERY_HIGHLIGHT_FORCE_SOURCE);
}
public boolean isQueryHighlightForceSource() {
return is(FessConfig.QUERY_HIGHLIGHT_FORCE_SOURCE);
}
public String getQueryHighlightFragmenter() {
return get(FessConfig.QUERY_HIGHLIGHT_FRAGMENTER);
}
public String getQueryHighlightFragmentOffset() {
return get(FessConfig.QUERY_HIGHLIGHT_FRAGMENT_OFFSET);
}
public Integer getQueryHighlightFragmentOffsetAsInteger() {
return getAsInteger(FessConfig.QUERY_HIGHLIGHT_FRAGMENT_OFFSET);
}
public String getQueryHighlightNoMatchSize() {
return get(FessConfig.QUERY_HIGHLIGHT_NO_MATCH_SIZE);
}
public Integer getQueryHighlightNoMatchSizeAsInteger() {
return getAsInteger(FessConfig.QUERY_HIGHLIGHT_NO_MATCH_SIZE);
}
public String getQueryHighlightOrder() {
return get(FessConfig.QUERY_HIGHLIGHT_ORDER);
}
public String getQueryHighlightPhraseLimit() {
return get(FessConfig.QUERY_HIGHLIGHT_PHRASE_LIMIT);
}
public Integer getQueryHighlightPhraseLimitAsInteger() {
return getAsInteger(FessConfig.QUERY_HIGHLIGHT_PHRASE_LIMIT);
}
public String getQueryHighlightContentDescriptionFields() {
return get(FessConfig.QUERY_HIGHLIGHT_CONTENT_DESCRIPTION_FIELDS);
}
@ -8353,10 +8564,10 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
"-Djava.awt.headless=true\n-Dfile.encoding=UTF-8\n-Djna.nosys=true\n-Djdk.io.permissionsUseCanonicalPath=true\n-Dhttp.maxConnections=20\n-server\n-Xms512m\n-Xmx512m\n-XX:MaxMetaspaceSize=128m\n-XX:CompressedClassSpaceSize=32m\n-XX:-UseGCOverheadLimit\n-XX:+UseTLAB\n-XX:+DisableExplicitGC\n-XX:+HeapDumpOnOutOfMemoryError\n-XX:-OmitStackTraceInFastThrow\n-XX:+UnlockExperimentalVMOptions\n-XX:+UseG1GC\n-XX:InitiatingHeapOccupancyPercent=45\n-XX:G1HeapRegionSize=1m\n-XX:MaxGCPauseMillis=60000\n-XX:G1NewSizePercent=5\n-XX:G1MaxNewSizePercent=5\n-Djcifs.smb.client.responseTimeout=30000\n-Djcifs.smb.client.soTimeout=35000\n-Djcifs.smb.client.connTimeout=60000\n-Djcifs.smb.client.sessionTimeout=60000\n-Djcifs.smb1.smb.client.connTimeout=60000\n-Djcifs.smb1.smb.client.soTimeout=35000\n-Djcifs.smb1.smb.client.responseTimeout=30000\n-Dgroovy.use.classvalue=true\n-Dio.netty.noUnsafe=true\n-Dio.netty.noKeySetOptimization=true\n-Dio.netty.recycler.maxCapacityPerThread=0\n-Dlog4j.shutdownHookEnabled=false\n-Dlog4j2.disable.jmx=true\n-Dlog4j.skipJansi=true\n-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider\n-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true\n");
defaultMap
.put(FessConfig.JVM_SUGGEST_OPTIONS,
"-Djava.awt.headless=true\n-Dfile.encoding=UTF-8\n-Djna.nosys=true\n-Djdk.io.permissionsUseCanonicalPath=true\n-server\n-Xms256m\n-Xmx256m\n-XX:MaxMetaspaceSize=128m\n-XX:CompressedClassSpaceSize=32m\n-XX:-UseGCOverheadLimit\n-XX:+UseTLAB\n-XX:+DisableExplicitGC\n-XX:+HeapDumpOnOutOfMemoryError\n-XX:+UnlockExperimentalVMOptions\n-XX:+UseG1GC\n-XX:InitiatingHeapOccupancyPercent=45\n-XX:G1HeapRegionSize=1m\n-XX:MaxGCPauseMillis=60000\n-XX:G1NewSizePercent=5\n-XX:G1MaxNewSizePercent=30\n-Dgroovy.use.classvalue=true\n-Dio.netty.noUnsafe=true\n-Dio.netty.noKeySetOptimization=true\n-Dio.netty.recycler.maxCapacityPerThread=0\n-Dlog4j.shutdownHookEnabled=false\n-Dlog4j2.disable.jmx=true\n-Dlog4j.skipJansi=true\n");
"-Djava.awt.headless=true\n-Dfile.encoding=UTF-8\n-Djna.nosys=true\n-Djdk.io.permissionsUseCanonicalPath=true\n-server\n-Xms128m\n-Xmx256m\n-XX:MaxMetaspaceSize=128m\n-XX:CompressedClassSpaceSize=32m\n-XX:-UseGCOverheadLimit\n-XX:+UseTLAB\n-XX:+DisableExplicitGC\n-XX:+HeapDumpOnOutOfMemoryError\n-XX:+UnlockExperimentalVMOptions\n-XX:+UseG1GC\n-XX:InitiatingHeapOccupancyPercent=45\n-XX:G1HeapRegionSize=1m\n-XX:MaxGCPauseMillis=60000\n-XX:G1NewSizePercent=5\n-XX:G1MaxNewSizePercent=30\n-Dgroovy.use.classvalue=true\n-Dio.netty.noUnsafe=true\n-Dio.netty.noKeySetOptimization=true\n-Dio.netty.recycler.maxCapacityPerThread=0\n-Dlog4j.shutdownHookEnabled=false\n-Dlog4j2.disable.jmx=true\n-Dlog4j.skipJansi=true\n");
defaultMap
.put(FessConfig.JVM_THUMBNAIL_OPTIONS,
"-Djava.awt.headless=true\n-Dfile.encoding=UTF-8\n-Djna.nosys=true\n-Djdk.io.permissionsUseCanonicalPath=true\n-server\n-Xms128m\n-Xmx128m\n-XX:MaxMetaspaceSize=128m\n-XX:CompressedClassSpaceSize=32m\n-XX:-UseGCOverheadLimit\n-XX:+UseTLAB\n-XX:+DisableExplicitGC\n-XX:+HeapDumpOnOutOfMemoryError\n-XX:-OmitStackTraceInFastThrow\n-XX:+UnlockExperimentalVMOptions\n-XX:+UseG1GC\n-XX:InitiatingHeapOccupancyPercent=45\n-XX:G1HeapRegionSize=4m\n-XX:MaxGCPauseMillis=60000\n-XX:G1NewSizePercent=5\n-XX:G1MaxNewSizePercent=50\n-Djcifs.smb.client.responseTimeout=30000\n-Djcifs.smb.client.soTimeout=35000\n-Djcifs.smb.client.connTimeout=60000\n-Djcifs.smb.client.sessionTimeout=60000\n-Djcifs.smb1.smb.client.connTimeout=60000\n-Djcifs.smb1.smb.client.soTimeout=35000\n-Djcifs.smb1.smb.client.responseTimeout=30000\n-Dgroovy.use.classvalue=true\n-Dio.netty.noUnsafe=true\n-Dio.netty.noKeySetOptimization=true\n-Dio.netty.recycler.maxCapacityPerThread=0\n-Dlog4j.shutdownHookEnabled=false\n-Dlog4j2.disable.jmx=true\n-Dlog4j.skipJansi=true\n-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider\n-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true\n");
"-Djava.awt.headless=true\n-Dfile.encoding=UTF-8\n-Djna.nosys=true\n-Djdk.io.permissionsUseCanonicalPath=true\n-server\n-Xms128m\n-Xmx256m\n-XX:MaxMetaspaceSize=128m\n-XX:CompressedClassSpaceSize=32m\n-XX:-UseGCOverheadLimit\n-XX:+UseTLAB\n-XX:+DisableExplicitGC\n-XX:+HeapDumpOnOutOfMemoryError\n-XX:-OmitStackTraceInFastThrow\n-XX:+UnlockExperimentalVMOptions\n-XX:+UseG1GC\n-XX:InitiatingHeapOccupancyPercent=45\n-XX:G1HeapRegionSize=4m\n-XX:MaxGCPauseMillis=60000\n-XX:G1NewSizePercent=5\n-XX:G1MaxNewSizePercent=50\n-Djcifs.smb.client.responseTimeout=30000\n-Djcifs.smb.client.soTimeout=35000\n-Djcifs.smb.client.connTimeout=60000\n-Djcifs.smb.client.sessionTimeout=60000\n-Djcifs.smb1.smb.client.connTimeout=60000\n-Djcifs.smb1.smb.client.soTimeout=35000\n-Djcifs.smb1.smb.client.responseTimeout=30000\n-Dgroovy.use.classvalue=true\n-Dio.netty.noUnsafe=true\n-Dio.netty.noKeySetOptimization=true\n-Dio.netty.recycler.maxCapacityPerThread=0\n-Dlog4j.shutdownHookEnabled=false\n-Dlog4j2.disable.jmx=true\n-Dlog4j.skipJansi=true\n-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider\n-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true\n");
defaultMap.put(FessConfig.JOB_SYSTEM_JOB_IDS, "default_crawler");
defaultMap.put(FessConfig.JOB_TEMPLATE_TITLE_WEB, "Web Crawler - {0}");
defaultMap.put(FessConfig.JOB_TEMPLATE_TITLE_FILE, "File Crawler - {0}");
@ -8538,6 +8749,16 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_TYPE, "fvh");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_TAG_PRE, "<strong>");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_TAG_POST, "</strong>");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_BOUNDARY_CHARS, "\t\n ");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_BOUNDARY_MAX_SCAN, "20");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_BOUNDARY_SCANNER, "sentence");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_ENCODER, "default");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_FORCE_SOURCE, "false");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_FRAGMENTER, "span");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_FRAGMENT_OFFSET, "-1");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_NO_MATCH_SIZE, "0");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_ORDER, "score");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_PHRASE_LIMIT, "256");
defaultMap.put(FessConfig.QUERY_HIGHLIGHT_CONTENT_DESCRIPTION_FIELDS, "hl_content,digest");
defaultMap.put(FessConfig.QUERY_MAX_SEARCH_RESULT_OFFSET, "100000");
defaultMap.put(FessConfig.QUERY_ADDITIONAL_DEFAULT_FIELDS, "");

View file

@ -71,6 +71,8 @@ import org.lastaflute.web.validation.theme.typed.LongTypeValidator;
public interface FessProp {
String QUERY_HIGHLIGHT_BOUNDARY_CHARS = "queryHighlightBoundaryChars";
String QUERY_TRACK_TOTAL_HITS_VALUE = "queryTrackTotalHitsValue";
String CORS_ALLOW_ORIGIN = "CorsAllowOrigin";
@ -2022,4 +2024,20 @@ public interface FessProp {
}
return pattern.matcher(version).matches();
}
String getQueryHighlightBoundaryChars();
default char[] getQueryHighlightBoundaryCharsAsArray() {
char[] chars = (char[]) propMap.get(QUERY_HIGHLIGHT_BOUNDARY_CHARS);
if (chars == null) {
final String value = getQueryHighlightBoundaryChars();
chars = new char[value.length()];
for (int i = 0; i < value.length(); i++) {
chars[i] = value.charAt(i);
}
propMap.put(QUERY_HIGHLIGHT_BOUNDARY_CHARS, chars);
}
return chars;
}
}

View file

@ -340,6 +340,16 @@ query.highlight.number.of.fragments=2
query.highlight.type=fvh
query.highlight.tag.pre=<strong>
query.highlight.tag.post=</strong>
query.highlight.boundary.chars=\u0009\u000A\u0013\u0020
query.highlight.boundary.max.scan=20
query.highlight.boundary.scanner=sentence
query.highlight.encoder=default
query.highlight.force.source=false
query.highlight.fragmenter=span
query.highlight.fragment.offset=-1
query.highlight.no.match.size=0
query.highlight.order=score
query.highlight.phrase.limit=256
query.highlight.content.description.fields=hl_content,digest
query.max.search.result.offset=100000
query.additional.default.fields=