mirror of https://github.com/apache/lucene.git
SOLR-2107: MoreLikeThisHandler doesn't work with alternate qparsers
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@993576 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
50663b8570
commit
63f331d880
|
@ -458,6 +458,8 @@ Bug Fixes
|
||||||
to be removed before it was finished being copied. This did not affect
|
to be removed before it was finished being copied. This did not affect
|
||||||
normal master/slave replication. (Peter Sturge via yonik)
|
normal master/slave replication. (Peter Sturge via yonik)
|
||||||
|
|
||||||
|
* SOLR-2107: MoreLikeThisHandler doesn't work with alternate qparsers. (yonik)
|
||||||
|
|
||||||
|
|
||||||
Other Changes
|
Other Changes
|
||||||
----------------------
|
----------------------
|
||||||
|
|
|
@ -34,10 +34,8 @@ import java.util.regex.Pattern;
|
||||||
import org.apache.lucene.document.Document;
|
import org.apache.lucene.document.Document;
|
||||||
import org.apache.lucene.index.IndexReader;
|
import org.apache.lucene.index.IndexReader;
|
||||||
import org.apache.lucene.index.Term;
|
import org.apache.lucene.index.Term;
|
||||||
import org.apache.lucene.search.BooleanClause;
|
import org.apache.lucene.queryParser.ParseException;
|
||||||
import org.apache.lucene.search.BooleanQuery;
|
import org.apache.lucene.search.*;
|
||||||
import org.apache.lucene.search.Query;
|
|
||||||
import org.apache.lucene.search.TermQuery;
|
|
||||||
import org.apache.lucene.search.similar.MoreLikeThis;
|
import org.apache.lucene.search.similar.MoreLikeThis;
|
||||||
import org.apache.solr.common.SolrException;
|
import org.apache.solr.common.SolrException;
|
||||||
import org.apache.solr.common.params.CommonParams;
|
import org.apache.solr.common.params.CommonParams;
|
||||||
|
@ -54,11 +52,7 @@ import org.apache.solr.request.SolrQueryRequest;
|
||||||
import org.apache.solr.response.SolrQueryResponse;
|
import org.apache.solr.response.SolrQueryResponse;
|
||||||
import org.apache.solr.schema.IndexSchema;
|
import org.apache.solr.schema.IndexSchema;
|
||||||
import org.apache.solr.schema.SchemaField;
|
import org.apache.solr.schema.SchemaField;
|
||||||
import org.apache.solr.search.DocIterator;
|
import org.apache.solr.search.*;
|
||||||
import org.apache.solr.search.DocList;
|
|
||||||
import org.apache.solr.search.DocListAndSet;
|
|
||||||
import org.apache.solr.search.QueryParsing;
|
|
||||||
import org.apache.solr.search.SolrIndexSearcher;
|
|
||||||
|
|
||||||
import org.apache.solr.util.SolrPluginUtils;
|
import org.apache.solr.util.SolrPluginUtils;
|
||||||
|
|
||||||
|
@ -83,20 +77,52 @@ public class MoreLikeThisHandler extends RequestHandlerBase
|
||||||
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception
|
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception
|
||||||
{
|
{
|
||||||
SolrParams params = req.getParams();
|
SolrParams params = req.getParams();
|
||||||
|
|
||||||
|
// Set field flags
|
||||||
|
String fl = params.get(CommonParams.FL);
|
||||||
|
int flags = 0;
|
||||||
|
if (fl != null) {
|
||||||
|
flags |= SolrPluginUtils.setReturnFields(fl, rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
String defType = params.get(QueryParsing.DEFTYPE, QParserPlugin.DEFAULT_QTYPE);
|
||||||
|
String q = params.get( CommonParams.Q );
|
||||||
|
Query query = null;
|
||||||
|
SortSpec sortSpec = null;
|
||||||
|
List<Query> filters = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (q != null) {
|
||||||
|
QParser parser = QParser.getParser(q, defType, req);
|
||||||
|
query = parser.getQuery();
|
||||||
|
sortSpec = parser.getSort(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] fqs = req.getParams().getParams(CommonParams.FQ);
|
||||||
|
if (fqs!=null && fqs.length!=0) {
|
||||||
|
filters = new ArrayList<Query>();
|
||||||
|
for (String fq : fqs) {
|
||||||
|
if (fq != null && fq.trim().length()!=0) {
|
||||||
|
QParser fqp = QParser.getParser(fq, null, req);
|
||||||
|
filters.add(fqp.getQuery());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (ParseException e) {
|
||||||
|
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
|
||||||
|
}
|
||||||
|
|
||||||
SolrIndexSearcher searcher = req.getSearcher();
|
SolrIndexSearcher searcher = req.getSearcher();
|
||||||
|
|
||||||
|
|
||||||
MoreLikeThisHelper mlt = new MoreLikeThisHelper( params, searcher );
|
MoreLikeThisHelper mlt = new MoreLikeThisHelper( params, searcher );
|
||||||
List<Query> filters = SolrPluginUtils.parseFilterQueries(req);
|
|
||||||
|
|
||||||
// Hold on to the interesting terms if relevant
|
// Hold on to the interesting terms if relevant
|
||||||
TermStyle termStyle = TermStyle.get( params.get( MoreLikeThisParams.INTERESTING_TERMS ) );
|
TermStyle termStyle = TermStyle.get( params.get( MoreLikeThisParams.INTERESTING_TERMS ) );
|
||||||
List<InterestingTerm> interesting = (termStyle == TermStyle.NONE )
|
List<InterestingTerm> interesting = (termStyle == TermStyle.NONE )
|
||||||
? null : new ArrayList<InterestingTerm>( mlt.mlt.getMaxQueryTerms() );
|
? null : new ArrayList<InterestingTerm>( mlt.mlt.getMaxQueryTerms() );
|
||||||
|
|
||||||
DocListAndSet mltDocs = null;
|
DocListAndSet mltDocs = null;
|
||||||
String q = params.get( CommonParams.Q );
|
|
||||||
|
|
||||||
// Parse Required Params
|
// Parse Required Params
|
||||||
// This will either have a single Reader or valid query
|
// This will either have a single Reader or valid query
|
||||||
Reader reader = null;
|
Reader reader = null;
|
||||||
|
@ -115,13 +141,6 @@ public class MoreLikeThisHandler extends RequestHandlerBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// What fields do we need to return
|
|
||||||
String fl = params.get(CommonParams.FL);
|
|
||||||
int flags = 0;
|
|
||||||
if (fl != null) {
|
|
||||||
flags |= SolrPluginUtils.setReturnFields(fl, rsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
int start = params.getInt(CommonParams.START, 0);
|
int start = params.getInt(CommonParams.START, 0);
|
||||||
int rows = params.getInt(CommonParams.ROWS, 10);
|
int rows = params.getInt(CommonParams.ROWS, 10);
|
||||||
|
|
||||||
|
@ -136,8 +155,6 @@ public class MoreLikeThisHandler extends RequestHandlerBase
|
||||||
true);
|
true);
|
||||||
int matchOffset = params.getInt(MoreLikeThisParams.MATCH_OFFSET, 0);
|
int matchOffset = params.getInt(MoreLikeThisParams.MATCH_OFFSET, 0);
|
||||||
// Find the base match
|
// Find the base match
|
||||||
Query query = QueryParsing.parseQuery(q, params.get(CommonParams.DF),
|
|
||||||
params, req.getSchema());
|
|
||||||
DocList match = searcher.getDocList(query, null, null, matchOffset, 1,
|
DocList match = searcher.getDocList(query, null, null, matchOffset, 1,
|
||||||
flags); // only get the first one...
|
flags); // only get the first one...
|
||||||
if (includeMatch) {
|
if (includeMatch) {
|
||||||
|
|
|
@ -111,6 +111,9 @@ public class MinimalSchemaTest extends SolrTestCaseJ4 {
|
||||||
if (handler.startsWith("/update")) {
|
if (handler.startsWith("/update")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (handler.startsWith("/mlt")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
assertQ("failure w/handler: '" + handler + "'",
|
assertQ("failure w/handler: '" + handler + "'",
|
||||||
req("qt", handler,
|
req("qt", handler,
|
||||||
|
|
|
@ -21,10 +21,7 @@ import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.solr.common.params.CommonParams;
|
import org.apache.solr.common.params.*;
|
||||||
import org.apache.solr.common.params.MoreLikeThisParams;
|
|
||||||
import org.apache.solr.common.params.MultiMapSolrParams;
|
|
||||||
import org.apache.solr.common.params.SolrParams;
|
|
||||||
import org.apache.solr.common.util.ContentStream;
|
import org.apache.solr.common.util.ContentStream;
|
||||||
import org.apache.solr.common.util.ContentStreamBase;
|
import org.apache.solr.common.util.ContentStreamBase;
|
||||||
import org.apache.solr.core.SolrCore;
|
import org.apache.solr.core.SolrCore;
|
||||||
|
@ -53,9 +50,8 @@ public class MoreLikeThisHandlerTest extends AbstractSolrTestCase {
|
||||||
SolrCore core = h.getCore();
|
SolrCore core = h.getCore();
|
||||||
MoreLikeThisHandler mlt = new MoreLikeThisHandler();
|
MoreLikeThisHandler mlt = new MoreLikeThisHandler();
|
||||||
|
|
||||||
Map<String,String[]> params = new HashMap<String,String[]>();
|
ModifiableSolrParams params = new ModifiableSolrParams();
|
||||||
MultiMapSolrParams mmparams = new MultiMapSolrParams( params );
|
SolrQueryRequestBase req = new SolrQueryRequestBase( core, params) {};
|
||||||
SolrQueryRequestBase req = new SolrQueryRequestBase( core, (SolrParams)mmparams ) {};
|
|
||||||
|
|
||||||
// requires 'q' or single content stream
|
// requires 'q' or single content stream
|
||||||
try {
|
try {
|
||||||
|
@ -80,29 +76,49 @@ public class MoreLikeThisHandlerTest extends AbstractSolrTestCase {
|
||||||
assertU(adoc("id","46","name","Nicole Kidman","subword","Batman","subword","Days of Thunder","subword","Eyes Wide Shut","subword","Far and Away"));
|
assertU(adoc("id","46","name","Nicole Kidman","subword","Batman","subword","Days of Thunder","subword","Eyes Wide Shut","subword","Far and Away"));
|
||||||
assertU(commit());
|
assertU(commit());
|
||||||
|
|
||||||
params.put(CommonParams.Q, new String[]{"id:42"});
|
params.set(CommonParams.Q, "id:42");
|
||||||
params.put(MoreLikeThisParams.MLT, new String[]{"true"});
|
params.set(MoreLikeThisParams.MLT, "true");
|
||||||
params.put(MoreLikeThisParams.SIMILARITY_FIELDS, new String[]{"name,subword,foo_ti"});
|
params.set(MoreLikeThisParams.SIMILARITY_FIELDS, "name,subword,foo_ti");
|
||||||
params.put(MoreLikeThisParams.INTERESTING_TERMS,new String[]{"details"});
|
params.set(MoreLikeThisParams.INTERESTING_TERMS, "details");
|
||||||
params.put(MoreLikeThisParams.MIN_TERM_FREQ,new String[]{"1"});
|
params.set(MoreLikeThisParams.MIN_TERM_FREQ,"1");
|
||||||
params.put(MoreLikeThisParams.MIN_DOC_FREQ,new String[]{"1"});
|
params.set(MoreLikeThisParams.MIN_DOC_FREQ,"1");
|
||||||
params.put("indent",new String[]{"true"});
|
params.set("indent","true");
|
||||||
|
|
||||||
SolrQueryRequest mltreq = new LocalSolrQueryRequest( core, (SolrParams)mmparams);
|
SolrQueryRequest mltreq = new LocalSolrQueryRequest( core, params);
|
||||||
assertQ("morelikethis - tom cruise",mltreq
|
assertQ("morelikethis - tom cruise",mltreq
|
||||||
,"//result/doc[1]/int[@name='id'][.='46']"
|
,"//result/doc[1]/int[@name='id'][.='46']"
|
||||||
,"//result/doc[2]/int[@name='id'][.='43']");
|
,"//result/doc[2]/int[@name='id'][.='43']");
|
||||||
|
|
||||||
params.put(CommonParams.Q, new String[]{"id:44"});
|
params.set(CommonParams.Q, "id:44");
|
||||||
assertQ("morelike this - harrison ford",mltreq
|
assertQ("morelike this - harrison ford",mltreq
|
||||||
,"//result/doc[1]/int[@name='id'][.='45']");
|
,"//result/doc[1]/int[@name='id'][.='45']");
|
||||||
|
|
||||||
params.put(CommonParams.Q, new String[]{"id:42"});
|
// test that qparser plugins work
|
||||||
params.put(MoreLikeThisParams.QF,new String[]{"name^5.0 subword^0.1"});
|
params.set(CommonParams.Q, "{!field f=id}44");
|
||||||
|
assertQ(mltreq
|
||||||
|
,"//result/doc[1]/int[@name='id'][.='45']");
|
||||||
|
|
||||||
|
params.set(CommonParams.Q, "id:42");
|
||||||
|
params.set(MoreLikeThisParams.QF,"name^5.0 subword^0.1");
|
||||||
assertQ("morelikethis with weights",mltreq
|
assertQ("morelikethis with weights",mltreq
|
||||||
,"//result/doc[1]/int[@name='id'][.='43']"
|
,"//result/doc[1]/int[@name='id'][.='43']"
|
||||||
,"//result/doc[2]/int[@name='id'][.='46']");
|
,"//result/doc[2]/int[@name='id'][.='46']");
|
||||||
|
|
||||||
|
|
||||||
|
// test that qparser plugins work w/ the MoreLikeThisHandler
|
||||||
|
params.set(CommonParams.QT, "/mlt");
|
||||||
|
params.set(CommonParams.Q, "{!field f=id}44");
|
||||||
|
assertQ(mltreq
|
||||||
|
,"//result/doc[1]/int[@name='id'][.='45']");
|
||||||
|
|
||||||
|
// test that debugging works
|
||||||
|
params.set(CommonParams.QT, "/mlt");
|
||||||
|
params.set("debugQuery", "true");
|
||||||
|
assertQ(mltreq
|
||||||
|
,"//result/doc[1]/int[@name='id'][.='45']"
|
||||||
|
,"//lst[@name='debug']/lst[@name='explain']"
|
||||||
|
);
|
||||||
|
|
||||||
// params.put(MoreLikeThisParams.QF,new String[]{"foo_ti"});
|
// params.put(MoreLikeThisParams.QF,new String[]{"foo_ti"});
|
||||||
// String response = h.query(mltreq);
|
// String response = h.query(mltreq);
|
||||||
// System.out.println(response);
|
// System.out.println(response);
|
||||||
|
|
|
@ -423,6 +423,10 @@
|
||||||
<str>tvComponent</str>
|
<str>tvComponent</str>
|
||||||
</arr>
|
</arr>
|
||||||
</requestHandler>
|
</requestHandler>
|
||||||
|
|
||||||
|
<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">
|
||||||
|
</requestHandler>
|
||||||
|
|
||||||
<searchComponent class="solr.HighlightComponent" name="highlight">
|
<searchComponent class="solr.HighlightComponent" name="highlight">
|
||||||
<highlighting>
|
<highlighting>
|
||||||
<!-- Configure the standard fragmenter -->
|
<!-- Configure the standard fragmenter -->
|
||||||
|
|
Loading…
Reference in New Issue