You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jb...@apache.org on 2014/05/27 16:09:55 UTC
svn commit: r1597796 - in /lucene/dev/branches/branch_4x: ./ solr/
solr/core/ solr/core/src/java/org/apache/solr/handler/component/
solr/core/src/java/org/apache/solr/search/
solr/core/src/test/org/apache/solr/search/ solr/solrj/
solr/solrj/src/java/or...
Author: jbernste
Date: Tue May 27 14:09:54 2014
New Revision: 1597796
URL: http://svn.apache.org/r1597796
Log:
SOLR-5973: Pluggable Ranking Collectors and Merge Strategies
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/solr/ (props changed)
lucene/dev/branches/branch_4x/solr/core/ (props changed)
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java
lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java
lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java
lucene/dev/branches/branch_4x/solr/solrj/ (props changed)
lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/MergeStrategy.java Tue May 27 14:09:54 2014
@@ -23,8 +23,10 @@ import java.util.Comparator;
import java.io.IOException;
/**
- * The MergeStrategy class defines custom merge logic for distributed searches.
- **/
+* The MergeStrategy class defines custom merge logic for distributed searches.
+*
+* <b>Note: This API is experimental and may change in non backward-compatible ways in the future</b>
+**/
public interface MergeStrategy {
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java Tue May 27 14:09:54 2014
@@ -151,17 +151,28 @@ public class QueryComponent extends Sear
q = new BooleanQuery();
}
- if(q instanceof RankQuery) {
- MergeStrategy mergeStrategy = ((RankQuery)q).getMergeStrategy();
- if(mergeStrategy != null) {
- rb.addMergeStrategy(mergeStrategy);
- if(mergeStrategy.handlesMergeFields()) {
- rb.mergeFieldHandler = mergeStrategy;
+ rb.setQuery( q );
+
+
+ String rankQueryString = rb.req.getParams().get(CommonParams.RQ);
+ if(rankQueryString != null) {
+ QParser rqparser = QParser.getParser(rankQueryString, defType, req);
+ Query rq = rqparser.getQuery();
+ if(rq instanceof RankQuery) {
+ RankQuery rankQuery = (RankQuery)rq;
+ rb.setQuery(rankQuery.wrap(q)); //Wrap the RankQuery around the main query.
+ MergeStrategy mergeStrategy = rankQuery.getMergeStrategy();
+ if(mergeStrategy != null) {
+ rb.addMergeStrategy(mergeStrategy);
+ if(mergeStrategy.handlesMergeFields()) {
+ rb.mergeFieldHandler = mergeStrategy;
+ }
}
+ } else {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,"rq parameter must be a RankQuery");
}
}
- rb.setQuery( q );
rb.setSortSpec( parser.getSort(true) );
rb.setQparser(parser);
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/RankQuery.java Tue May 27 14:09:54 2014
@@ -17,13 +17,21 @@
package org.apache.solr.search;
+import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.TopDocsCollector;
import org.apache.lucene.search.Query;
import org.apache.solr.handler.component.MergeStrategy;
+import java.io.IOException;
+
+/**
+ * <b>Note: This API is experimental and may change in non backward-compatible ways in the future</b>
+ **/
+
public abstract class RankQuery extends Query {
- public abstract TopDocsCollector getTopDocsCollector(int len, SolrIndexSearcher.QueryCommand cmd);
+ public abstract TopDocsCollector getTopDocsCollector(int len, SolrIndexSearcher.QueryCommand cmd, IndexSearcher searcher) throws IOException;
public abstract MergeStrategy getMergeStrategy();
+ public abstract RankQuery wrap(Query mainQuery);
}
\ No newline at end of file
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java Tue May 27 14:09:54 2014
@@ -1482,7 +1482,7 @@ public class SolrIndexSearcher extends I
Query q = cmd.getQuery();
if(q instanceof RankQuery) {
RankQuery rq = (RankQuery)q;
- return rq.getTopDocsCollector(len, cmd);
+ return rq.getTopDocsCollector(len, cmd, this);
}
if (null == cmd.getSort()) {
Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/MergeStrategyTest.java Tue May 27 14:09:54 2014
@@ -80,18 +80,18 @@ public class MergeStrategyTest extends B
handle.put("_version_", SKIP);
//Test mergeStrategy that uses score
- query("q", "{!rank q=$qq}", "qq", "*:*", "rows","12", "sort", "sort_i asc", "fl","*,score");
+ query("rq", "{!rank}", "q", "*:*", "rows","12", "sort", "sort_i asc", "fl","*,score");
//Test without mergeStrategy
query("q", "*:*", "rows","12", "sort", "sort_i asc");
//Test mergeStrategy1 that uses a sort field.
- query("q", "{!rank mergeStrategy=1 q=$qq}", "qq", "*:*", "rows","12", "sort", "sort_i asc");
+ query("rq", "{!rank mergeStrategy=1}", "q", "*:*", "rows","12", "sort", "sort_i asc");
ModifiableSolrParams params = new ModifiableSolrParams();
- params.add("qq", "*:*");
+ params.add("q", "*:*");
params.add("rows", "12");
- params.add("q", "{!rank q=$qq}");
+ params.add("rq", "{!rank}");
params.add("sort", "sort_i asc");
params.add("fl","*,score");
setDistributedParams(params);
Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/RankQueryTest.java Tue May 27 14:09:54 2014
@@ -70,8 +70,8 @@ public class RankQueryTest extends SolrT
ModifiableSolrParams params = new ModifiableSolrParams();
- params.add("qq", "*:*");
- params.add("q", "{!rank q=$qq}");
+ params.add("q", "*:*");
+ params.add("rq", "{!rank}");
params.add("sort","sort_i asc");
assertQ(req(params), "*[count(//doc)=6]",
@@ -84,9 +84,9 @@ public class RankQueryTest extends SolrT
);
params = new ModifiableSolrParams();
- params.add("qq", "{!edismax bf=$bff}*:*");
+ params.add("q", "{!edismax bf=$bff}*:*");
params.add("bff", "field(sort_i)");
- params.add("q", "{!rank q=$qq collector=1}");
+ params.add("rq", "{!rank collector=1}");
assertQ(req(params), "*[count(//doc)=6]",
"//result/doc[6]/str[@name='id'][.='4']",
Modified: lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/search/TestRankQueryPlugin.java Tue May 27 14:09:54 2014
@@ -84,12 +84,10 @@ public class TestRankQueryPlugin extends
}
public Query parse() throws SyntaxError {
- String qs = localParams.get("q");
- QParser parser = QParser.getParser(qs, null, req);
- Query q = parser.getQuery();
+
int mergeStrategy = localParams.getInt("mergeStrategy", 0);
int collector = localParams.getInt("collector", 0);
- return new TestRankQuery(collector, mergeStrategy, q);
+ return new TestRankQuery(collector, mergeStrategy);
}
}
@@ -133,13 +131,17 @@ public class TestRankQueryPlugin extends
return q.toString(field);
}
- public TestRankQuery(int collector, int mergeStrategy, Query q) {
+ public RankQuery wrap(Query q) {
this.q = q;
+ return this;
+ }
+
+ public TestRankQuery(int collector, int mergeStrategy) {
this.collector = collector;
this.mergeStrategy = mergeStrategy;
}
- public TopDocsCollector getTopDocsCollector(int len, SolrIndexSearcher.QueryCommand cmd) {
+ public TopDocsCollector getTopDocsCollector(int len, SolrIndexSearcher.QueryCommand cmd, IndexSearcher searcher) {
if(collector == 0)
return new TestCollector(null);
else
Modified: lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java?rev=1597796&r1=1597795&r2=1597796&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java (original)
+++ lucene/dev/branches/branch_4x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java Tue May 27 14:09:54 2014
@@ -47,6 +47,9 @@ public interface CommonParams {
/** query string */
public static final String Q ="q";
+
+ /** rank query */
+ public static final String RQ ="rq";
/** distrib string */
public static final String DISTRIB = "distrib";