mirror of https://github.com/apache/lucene.git
SOLR-6248: Fixing an exception in case of missing qf
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1636784 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
7e07a9c578
commit
2c8de2f35c
|
@ -591,7 +591,7 @@ public final class MoreLikeThis {
|
||||||
* @param filteredDocument Document with field values extracted for selected fields.
|
* @param filteredDocument Document with field values extracted for selected fields.
|
||||||
* @return More Like This query for the passed document.
|
* @return More Like This query for the passed document.
|
||||||
*/
|
*/
|
||||||
public Query like(Map<String, ArrayList<String>> filteredDocument) throws IOException {
|
public Query like(Map<String, Collection<Object>> filteredDocument) throws IOException {
|
||||||
if (fieldNames == null) {
|
if (fieldNames == null) {
|
||||||
// gather list of valid fields from lucene
|
// gather list of valid fields from lucene
|
||||||
Collection<String> fields = MultiFields.getIndexedFields(ir);
|
Collection<String> fields = MultiFields.getIndexedFields(ir);
|
||||||
|
@ -754,16 +754,16 @@ public final class MoreLikeThis {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private PriorityQueue<ScoreTerm> retrieveTerms(Map<String, ArrayList<String>> fields) throws
|
private PriorityQueue<ScoreTerm> retrieveTerms(Map<String, Collection<Object>> fields) throws
|
||||||
IOException {
|
IOException {
|
||||||
HashMap<String,Int> termFreqMap = new HashMap();
|
HashMap<String,Int> termFreqMap = new HashMap();
|
||||||
for (String fieldName : fieldNames) {
|
for (String fieldName : fieldNames) {
|
||||||
|
|
||||||
for (String field : fields.keySet()) {
|
for (String field : fields.keySet()) {
|
||||||
ArrayList<String> fieldValues = fields.get(field);
|
Collection<Object> fieldValues = fields.get(field);
|
||||||
for(String fieldValue:fieldValues) {
|
for(Object fieldValue:fieldValues) {
|
||||||
if (fieldValue != null) {
|
if (fieldValue != null) {
|
||||||
addTermFrequencies(new StringReader(fieldValue), termFreqMap,
|
addTermFrequencies(new StringReader(String.valueOf(fieldValue)), termFreqMap,
|
||||||
fieldName);
|
fieldName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,11 +27,15 @@ import org.apache.solr.core.SolrCore;
|
||||||
import org.apache.solr.request.SolrQueryRequest;
|
import org.apache.solr.request.SolrQueryRequest;
|
||||||
import org.apache.solr.request.SolrQueryRequestBase;
|
import org.apache.solr.request.SolrQueryRequestBase;
|
||||||
import org.apache.solr.response.SolrQueryResponse;
|
import org.apache.solr.response.SolrQueryResponse;
|
||||||
|
import org.apache.solr.schema.SchemaField;
|
||||||
import org.apache.solr.search.QParser;
|
import org.apache.solr.search.QParser;
|
||||||
import org.apache.solr.search.QueryParsing;
|
import org.apache.solr.search.QueryParsing;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -42,6 +46,8 @@ public class CloudMLTQParser extends QParser {
|
||||||
super(qstr, localParams, params, req);
|
super(qstr, localParams, params, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Logger log = LoggerFactory
|
||||||
|
.getLogger(CloudMLTQParser.class);
|
||||||
public Query parse() {
|
public Query parse() {
|
||||||
String id = localParams.get(QueryParsing.V);
|
String id = localParams.get(QueryParsing.V);
|
||||||
// Do a Real Time Get for the document
|
// Do a Real Time Get for the document
|
||||||
|
@ -61,17 +67,27 @@ public class CloudMLTQParser extends QParser {
|
||||||
mlt.setAnalyzer(req.getSchema().getIndexAnalyzer());
|
mlt.setAnalyzer(req.getSchema().getIndexAnalyzer());
|
||||||
|
|
||||||
String[] qf = localParams.getParams("qf");
|
String[] qf = localParams.getParams("qf");
|
||||||
Map<String, ArrayList<String>> filteredDocument = new HashMap();
|
Map<String, Collection<Object>> filteredDocument = new HashMap();
|
||||||
|
|
||||||
if (qf != null) {
|
if (qf != null) {
|
||||||
mlt.setFieldNames(qf);
|
mlt.setFieldNames(qf);
|
||||||
for (String field : qf) {
|
for (String field : qf) {
|
||||||
filteredDocument.put(field, (ArrayList<String>) doc.get(field));
|
filteredDocument.put(field, doc.getFieldValues(field));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Map<String, SchemaField> fields = req.getSchema().getFields();
|
||||||
|
ArrayList<String> fieldNames = new ArrayList();
|
||||||
for (String field : doc.getFieldNames()) {
|
for (String field : doc.getFieldNames()) {
|
||||||
filteredDocument.put(field, (ArrayList<String>) doc.get(field));
|
// Only use fields that are stored and have an explicit analyzer.
|
||||||
|
// This makes sense as the query uses tf/idf/.. for query construction.
|
||||||
|
// We might want to relook and change this in the future though.
|
||||||
|
if(fields.get(field).stored()
|
||||||
|
&& fields.get(field).getType().isExplicitAnalyzer()) {
|
||||||
|
fieldNames.add(field);
|
||||||
|
filteredDocument.put(field, doc.getFieldValues(field));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
mlt.setFieldNames(fieldNames.toArray(new String[fieldNames.size()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -129,6 +129,20 @@ public class CloudMLTQParserTest extends AbstractFullDistribZkTestBase {
|
||||||
compareParsedQueryStrings(expectedQueryString,
|
compareParsedQueryStrings(expectedQueryString,
|
||||||
actualParsedQueries.get(counter)));
|
actualParsedQueries.get(counter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Assert that {!mlt}id does not throw an exception i.e. implicitly, only fields that are stored + have explicit
|
||||||
|
// analyzer are used for MLT Query construction.
|
||||||
|
params = new ModifiableSolrParams();
|
||||||
|
params.set(CommonParams.Q, "{!mlt}20");
|
||||||
|
|
||||||
|
queryResponse = queryServer(params);
|
||||||
|
solrDocuments = queryResponse.getResults();
|
||||||
|
expectedIds = new int[]{18, 23, 13, 14, 20, 22, 19, 21, 15, 16};
|
||||||
|
i = 0;
|
||||||
|
for (SolrDocument solrDocument : solrDocuments) {
|
||||||
|
actualIds[i++] = Integer.valueOf(String.valueOf(solrDocument.getFieldValue("id")));
|
||||||
|
}
|
||||||
|
assertArrayEquals(expectedIds, actualIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean compareParsedQueryStrings(String expected, String actual) {
|
private boolean compareParsedQueryStrings(String expected, String actual) {
|
||||||
|
|
Loading…
Reference in New Issue