[
https://issues.apache.org/jira/browse/SOLR-5730?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15117693#comment-15117693
]
Christine Poerschke edited comment on SOLR-5730 at 1/26/16 6:34 PM:
--------------------------------------------------------------------
bq. solrconfig.xml to support something like a <mergepolicy> element which will
allow you to define a nested MP.
I also had noticed the similarity between the with-class-attribute
{{sortMerges}} element and the existing {{mergePolicy}} element. The elements
within a {{mergePolicy}} currently can be only primitive elements and
mergePolicy-within-mergePolicy elements might be confusing from a user's
perspective?
\\
\\
----
\\
If we want wrapper merge policies support then I would instead favour
'chaining' instead of 'nesting' of the solrconfig.xml elements, for example:
{code}
<indexConfig>
<mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
<int name="segmentsPerTier">42</int>
</mergePolicy>
<mergePolicy class="org.apache.lucene.index.SortingMergePolicy">
<str name="sort">timestamp desc</str>
</mergePolicy>
</indexConfig>
{code}
SolrIndexConfig.java code outline:
{code}
private MergePolicy buildMergePolicyChain(IndexSchema schema) {
MergePolicy policy = null;
for (PluginInfo mergePolicyInfo : mergePolicyInfos) {
String mpClassName = mergePolicyInfo.className;
Class<?> mpClass = schema.getResourceLoader().findClass(mpClassName,
MergePolicy.class);
NamedList initArgs = mergePolicyInfo.initArgs;
if (LogMergePolicy.class.isAssignableFrom(mpClass)) {
LogMergePolicy logMergePolicy =
schema.getResourceLoader().newInstance(mpClassName, LogMergePolicy.class);
// ...
policy = logMergePolicy;
} else if (TieredMergePolicy.class.isAssignableFrom(mpClass)) {
TieredMergePolicy tieredMergePolicy =
schema.getResourceLoader().newInstance(mpClassName, TieredMergePolicy.class);
// ...
policy = tieredMergePolicy;
} else if (SortingMergePolicy.class.isAssignableFrom(mpClass)) {
// clone initArgs so that we can remove the 'sort' element
initArgs = initArgs.clone();
final Object sortArg = initArgs.remove("sort");
// now parse the 'sort' element
final Sort mergeSort = SortSpecParsing.parseSortSpec((String)sortArg,
schema).getSort();
// then construct the sorting merge policy
log.info("Using {}(policy={},mergeSort={})", mpClassName, policy,
mergeSort);
SortingMergePolicy sortingMergePolicy =
schema.getResourceLoader().newInstance(mpClassName, SortingMergePolicy.class,
null,
new Class[] { MergePolicy.class, Sort.class },
new Object[] { policy, mergeSort });
policy = sortingMergePolicy;
} else {
policy = schema.getResourceLoader().newInstance(mpClassName,
MergePolicy.class);
}
SolrPluginUtils.invokeSetters(policy, initArgs);
}
return policy;
}
{code}
was (Author: cpoerschke):
bq. solrconfig.xml to support something like a <mergepolicy> element which will
allow you to define a nested MP.
I also had noticed the similarity between the with-class-attribute
{{sortMerges}} element and the existing {{mergePolicy}} element. The elements
within a {{mergePolicy}} currently can be only primitive elements and
mergePolicy-within-mergePolicy elements might be confusing from a users
perspective?
\\
\\
----
\\
If we want wrapper merge policies support then I would instead favour
'chaining' instead of 'nesting' of the solrconfig.xml elements, for example:
{code}
<indexConfig>
<mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
<int name="segmentsPerTier">42</int>
</mergePolicy>
<mergePolicy class="org.apache.lucene.index.SortingMergePolicy">
<str name="sort">timestamp desc</str>
</mergePolicy>
</indexConfig>
{code}
SolrIndexConfig.java code outline:
{code}
private MergePolicy buildMergePolicyChain(IndexSchema schema) {
MergePolicy policy = null;
for (PluginInfo mergePolicyInfo : mergePolicyInfos) {
String mpClassName = mergePolicyInfo.className;
Class<?> mpClass = schema.getResourceLoader().findClass(mpClassName,
MergePolicy.class);
NamedList initArgs = mergePolicyInfo.initArgs;
if (LogMergePolicy.class.isAssignableFrom(mpClass)) {
LogMergePolicy logMergePolicy =
schema.getResourceLoader().newInstance(mpClassName, LogMergePolicy.class);
// ...
policy = logMergePolicy;
} else if (TieredMergePolicy.class.isAssignableFrom(mpClass)) {
TieredMergePolicy tieredMergePolicy =
schema.getResourceLoader().newInstance(mpClassName, TieredMergePolicy.class);
// ...
policy = tieredMergePolicy;
} else if (SortingMergePolicy.class.isAssignableFrom(mpClass)) {
// clone initArgs so that we can remove the 'sort' element
initArgs = mergePolicyInfo.initArgs.clone();
final Object sortArg = initArgs.remove("sort");
// now parse the 'sort' element
final Sort mergeSort = SortSpecParsing.parseSortSpec((String)sortArg,
schema).getSort();
// then construct the sorting merge policy
log.info("Using {}(policy={},mergeSort={})", mpClassName, policy,
mergeSort);
SortingMergePolicy sortingMergePolicy =
schema.getResourceLoader().newInstance(mpClassName, SortingMergePolicy.class,
null,
new Class[] { MergePolicy.class, Sort.class },
new Object[] { policy, mergeSort });
policy = sortingMergePolicy;
} else {
policy = schema.getResourceLoader().newInstance(mpClassName,
MergePolicy.class);
}
SolrPluginUtils.invokeSetters(policy, initArgs);
}
return policy;
}
{code}
> make Lucene's SortingMergePolicy and EarlyTerminatingSortingCollector
> configurable in Solr
> ------------------------------------------------------------------------------------------
>
> Key: SOLR-5730
> URL: https://issues.apache.org/jira/browse/SOLR-5730
> Project: Solr
> Issue Type: New Feature
> Reporter: Christine Poerschke
> Assignee: Christine Poerschke
> Priority: Minor
> Attachments: SOLR-5730-part1of2.patch, SOLR-5730-part1of2.patch,
> SOLR-5730-part2of2.patch, SOLR-5730-part2of2.patch
>
>
> *Example configuration (solrconfig.xml):*
> {noformat}
> <sortMerges enable="true">
> <str name="sort">timestamp desc</str>
> </sortMerges>
> {noformat}
> *Example use (EarlyTerminatingSortingCollector):*
> {noformat}
> &sort=timestamp+desc&segmentTerminateEarly=true
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]