mirror of https://github.com/apache/lucene.git
SOLR-1966: QueryElevationComponent can now optionally return only the elevated results
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@959434 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b2f3f2edff
commit
d69d138e4c
|
@ -186,6 +186,8 @@ New Features
|
|||
(ehatcher)
|
||||
|
||||
* SOLR-1974: Add LimitTokenCountFilterFactory. (koji)
|
||||
|
||||
* SOLR-1966: QueryElevationComponent can now return just the included results in the elevation file (gsingers, yonik)
|
||||
|
||||
Optimizations
|
||||
----------------------
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
package org.apache.solr.common.params;
|
||||
|
||||
|
||||
/**
|
||||
* Parameters used with the QueryElevationComponent
|
||||
*
|
||||
**/
|
||||
public interface QueryElevationParams {
|
||||
|
||||
String ENABLE = "enableElevation";
|
||||
String EXCLUSIVE = "exclusive";
|
||||
String FORCE_ELEVATION = "forceElevation";
|
||||
}
|
|
@ -29,6 +29,8 @@ import java.util.HashMap;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.WeakHashMap;
|
||||
|
||||
import org.apache.solr.common.params.QueryElevationParams;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
@ -77,22 +79,20 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore
|
|||
// Constants used in solrconfig.xml
|
||||
static final String FIELD_TYPE = "queryFieldType";
|
||||
static final String CONFIG_FILE = "config-file";
|
||||
static final String FORCE_ELEVATION = "forceElevation";
|
||||
static final String EXCLUDE = "exclude";
|
||||
|
||||
// Runtime param -- should be in common?
|
||||
static final String ENABLE = "enableElevation";
|
||||
|
||||
|
||||
private SolrParams initArgs = null;
|
||||
private Analyzer analyzer = null;
|
||||
private String idField = null;
|
||||
|
||||
boolean forceElevation = false;
|
||||
|
||||
// For each IndexReader, keep a query->elevation map
|
||||
// When the configuration is loaded from the data directory.
|
||||
// The key is null if loaded from the config directory, and
|
||||
// is never re-loaded.
|
||||
final Map<IndexReader,Map<String, ElevationObj>> elevationCache =
|
||||
final Map<IndexReader,Map<String, ElevationObj>> elevationCache =
|
||||
new WeakHashMap<IndexReader, Map<String,ElevationObj>>();
|
||||
|
||||
class ElevationObj {
|
||||
|
@ -160,7 +160,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore
|
|||
}
|
||||
idField = StringHelper.intern(sf.getName());
|
||||
|
||||
forceElevation = initArgs.getBool( FORCE_ELEVATION, forceElevation );
|
||||
forceElevation = initArgs.getBool( QueryElevationParams.FORCE_ELEVATION, forceElevation );
|
||||
try {
|
||||
synchronized( elevationCache ) {
|
||||
elevationCache.clear();
|
||||
|
@ -316,12 +316,13 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore
|
|||
SolrQueryRequest req = rb.req;
|
||||
SolrParams params = req.getParams();
|
||||
// A runtime param can skip
|
||||
if( !params.getBool( ENABLE, true ) ) {
|
||||
if( !params.getBool( QueryElevationParams.ENABLE, true ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean exclusive = params.getBool(QueryElevationParams.EXCLUSIVE, false);
|
||||
// A runtime parameter can alter the config value for forceElevation
|
||||
boolean force = params.getBool( FORCE_ELEVATION, forceElevation );
|
||||
boolean force = params.getBool( QueryElevationParams.FORCE_ELEVATION, forceElevation );
|
||||
|
||||
Query query = rb.getQuery();
|
||||
String qstr = rb.getQueryString();
|
||||
|
@ -342,15 +343,21 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore
|
|||
|
||||
if( booster != null ) {
|
||||
// Change the query to insert forced documents
|
||||
BooleanQuery newq = new BooleanQuery( true );
|
||||
newq.add( query, BooleanClause.Occur.SHOULD );
|
||||
newq.add( booster.include, BooleanClause.Occur.SHOULD );
|
||||
if( booster.exclude != null ) {
|
||||
for( BooleanClause bq : booster.exclude ) {
|
||||
newq.add( bq );
|
||||
if (exclusive == true){
|
||||
//we only want these results
|
||||
rb.setQuery(booster.include);
|
||||
} else {
|
||||
BooleanQuery newq = new BooleanQuery( true );
|
||||
newq.add( query, BooleanClause.Occur.SHOULD );
|
||||
newq.add( booster.include, BooleanClause.Occur.SHOULD );
|
||||
if( booster.exclude != null ) {
|
||||
for( BooleanClause bq : booster.exclude ) {
|
||||
newq.add( bq );
|
||||
}
|
||||
}
|
||||
rb.setQuery( newq );
|
||||
}
|
||||
rb.setQuery( newq );
|
||||
|
||||
|
||||
// if the sort is 'score desc' use a custom sorting method to
|
||||
// insert documents in their proper place
|
||||
|
|
|
@ -29,6 +29,7 @@ import org.apache.lucene.util.BytesRef;
|
|||
import org.apache.solr.SolrTestCaseJ4;
|
||||
import org.apache.solr.common.params.CommonParams;
|
||||
import org.apache.solr.common.params.MapSolrParams;
|
||||
import org.apache.solr.common.params.QueryElevationParams;
|
||||
import org.apache.solr.common.util.NamedList;
|
||||
import org.apache.solr.core.SolrCore;
|
||||
import org.apache.solr.handler.component.QueryElevationComponent.ElevationObj;
|
||||
|
@ -198,10 +199,19 @@ public class QueryElevationComponentTest extends SolrTestCaseJ4 {
|
|||
,"//result/doc[3]/str[@name='id'][.='b']"
|
||||
,"//result/doc[4]/str[@name='id'][.='c']"
|
||||
);
|
||||
|
||||
|
||||
//Test exclusive (not to be confused with exclusion)
|
||||
args.put(QueryElevationParams.EXCLUSIVE, "true");
|
||||
booster.setTopQueryResults( reader, query, new String[] { "x" }, new String[] {} );
|
||||
assertQ( null, req
|
||||
,"//*[@numFound='1']"
|
||||
,"//result/doc[1]/str[@name='id'][.='x']"
|
||||
);
|
||||
|
||||
// Test exclusion
|
||||
booster.elevationCache.clear();
|
||||
args.remove( CommonParams.SORT );
|
||||
args.remove( QueryElevationParams.EXCLUSIVE);
|
||||
booster.setTopQueryResults( reader, query, new String[] { "x" }, new String[] { "a" } );
|
||||
assertQ( null, req
|
||||
,"//*[@numFound='3']"
|
||||
|
@ -209,6 +219,7 @@ public class QueryElevationComponentTest extends SolrTestCaseJ4 {
|
|||
,"//result/doc[2]/str[@name='id'][.='b']"
|
||||
,"//result/doc[3]/str[@name='id'][.='c']"
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
// write a test file to boost some docs
|
||||
|
|
Loading…
Reference in New Issue