SOLR-11164, SOLR-11180, SOLR-11220: Fix NullPointerException and always-returns-zero contrib/ltr OriginalScoreFeature issues in SolrCloud mode.

(Yuki Yano, Jonathan Gonzalez, Ryan Yacyshyn, Christine Poerschke)
This commit is contained in:
Christine Poerschke 2017-08-25 14:26:13 +01:00
parent 554f0d5f20
commit 492265014b
4 changed files with 31 additions and 20 deletions

View File

@ -105,6 +105,10 @@ Bug Fixes
* SOLR-11289: fix comma handling in terms component. (yonik) * SOLR-11289: fix comma handling in terms component. (yonik)
* SOLR-11164, SOLR-11180, SOLR-11220: Fix NullPointerException and always-returns-zero
contrib/ltr OriginalScoreFeature issues in SolrCloud mode.
(Yuki Yano, Jonathan Gonzalez, Ryan Yacyshyn, Christine Poerschke)
Optimizations Optimizations
---------------------- ----------------------

View File

@ -225,15 +225,15 @@ public class LTRFeatureLoggerTransformerFactory extends TransformerFactory {
true, true,
threadManager); // request feature weights to be created for all features threadManager); // request feature weights to be created for all features
// Local transformer efi if provided
scoringQuery.setOriginalQuery(context.getQuery());
}catch (final Exception e) { }catch (final Exception e) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"retrieving the feature store "+featureStoreName, e); "retrieving the feature store "+featureStoreName, e);
} }
} }
if (scoringQuery.getOriginalQuery() == null) {
scoringQuery.setOriginalQuery(context.getQuery());
}
if (scoringQuery.getFeatureLogger() == null){ if (scoringQuery.getFeatureLogger() == null){
scoringQuery.setFeatureLogger( SolrQueryRequestContextUtils.getFeatureLogger(req) ); scoringQuery.setFeatureLogger( SolrQueryRequestContextUtils.getFeatureLogger(req) );
} }
@ -261,7 +261,7 @@ public class LTRFeatureLoggerTransformerFactory extends TransformerFactory {
@Override @Override
public void transform(SolrDocument doc, int docid) public void transform(SolrDocument doc, int docid)
throws IOException { throws IOException {
implTransform(doc, docid, 0.0f); implTransform(doc, docid, null);
} }
private void implTransform(SolrDocument doc, int docid, Float score) private void implTransform(SolrDocument doc, int docid, Float score)

View File

@ -29,6 +29,7 @@ import org.apache.solr.cloud.AbstractDistribZkTestBase;
import org.apache.solr.cloud.MiniSolrCloudCluster; import org.apache.solr.cloud.MiniSolrCloudCluster;
import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.cloud.ZkStateReader; import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.ltr.feature.OriginalScoreFeature;
import org.apache.solr.ltr.feature.SolrFeature; import org.apache.solr.ltr.feature.SolrFeature;
import org.apache.solr.ltr.feature.ValueFeature; import org.apache.solr.ltr.feature.ValueFeature;
import org.apache.solr.ltr.model.LinearModel; import org.apache.solr.ltr.model.LinearModel;
@ -53,9 +54,9 @@ public class TestLTROnSolrCloud extends TestRerankBase {
int numberOfShards = random().nextInt(4)+1; int numberOfShards = random().nextInt(4)+1;
int numberOfReplicas = random().nextInt(2)+1; int numberOfReplicas = random().nextInt(2)+1;
int maxShardsPerNode = numberOfShards+random().nextInt(4)+1; int maxShardsPerNode = random().nextInt(4)+1;
int numberOfNodes = numberOfShards * maxShardsPerNode; int numberOfNodes = (numberOfShards*numberOfReplicas + (maxShardsPerNode-1))/maxShardsPerNode;
setupSolrCluster(numberOfShards, numberOfReplicas, numberOfNodes, maxShardsPerNode); setupSolrCluster(numberOfShards, numberOfReplicas, numberOfNodes, maxShardsPerNode);
@ -106,21 +107,21 @@ public class TestLTROnSolrCloud extends TestRerankBase {
final Float original_result7_score = (Float)queryResponse.getResults().get(7).get("score"); final Float original_result7_score = (Float)queryResponse.getResults().get(7).get("score");
final String result0_features= FeatureLoggerTestUtils.toFeatureVector( final String result0_features= FeatureLoggerTestUtils.toFeatureVector(
"powpularityS","64.0", "c3","2.0"); "powpularityS","64.0", "c3","2.0", "original","0.0");
final String result1_features= FeatureLoggerTestUtils.toFeatureVector( final String result1_features= FeatureLoggerTestUtils.toFeatureVector(
"powpularityS","49.0", "c3","2.0"); "powpularityS","49.0", "c3","2.0", "original","1.0");
final String result2_features= FeatureLoggerTestUtils.toFeatureVector( final String result2_features= FeatureLoggerTestUtils.toFeatureVector(
"powpularityS","36.0", "c3","2.0"); "powpularityS","36.0", "c3","2.0", "original","2.0");
final String result3_features= FeatureLoggerTestUtils.toFeatureVector( final String result3_features= FeatureLoggerTestUtils.toFeatureVector(
"powpularityS","25.0", "c3","2.0"); "powpularityS","25.0", "c3","2.0", "original","3.0");
final String result4_features= FeatureLoggerTestUtils.toFeatureVector( final String result4_features= FeatureLoggerTestUtils.toFeatureVector(
"powpularityS","16.0", "c3","2.0"); "powpularityS","16.0", "c3","2.0", "original","4.0");
final String result5_features= FeatureLoggerTestUtils.toFeatureVector( final String result5_features= FeatureLoggerTestUtils.toFeatureVector(
"powpularityS", "9.0", "c3","2.0"); "powpularityS", "9.0", "c3","2.0", "original","5.0");
final String result6_features= FeatureLoggerTestUtils.toFeatureVector( final String result6_features= FeatureLoggerTestUtils.toFeatureVector(
"powpularityS", "4.0", "c3","2.0"); "powpularityS", "4.0", "c3","2.0", "original","6.0");
final String result7_features= FeatureLoggerTestUtils.toFeatureVector( final String result7_features= FeatureLoggerTestUtils.toFeatureVector(
"powpularityS", "1.0", "c3","2.0"); "powpularityS", "1.0", "c3","2.0", "original","7.0");
// Test feature vectors returned (without re-ranking) // Test feature vectors returned (without re-ranking)
@ -256,8 +257,8 @@ public class TestLTROnSolrCloud extends TestRerankBase {
private void loadModelsAndFeatures() throws Exception { private void loadModelsAndFeatures() throws Exception {
final String featureStore = "test"; final String featureStore = "test";
final String[] featureNames = new String[] {"powpularityS","c3"}; final String[] featureNames = new String[] {"powpularityS","c3", "original"};
final String jsonModelParams = "{\"weights\":{\"powpularityS\":1.0,\"c3\":1.0}}"; final String jsonModelParams = "{\"weights\":{\"powpularityS\":1.0,\"c3\":1.0,\"original\":0.1}}";
loadFeature( loadFeature(
featureNames[0], featureNames[0],
@ -271,6 +272,12 @@ public class TestLTROnSolrCloud extends TestRerankBase {
featureStore, featureStore,
"{\"value\":2}" "{\"value\":2}"
); );
loadFeature(
featureNames[2],
OriginalScoreFeature.class.getCanonicalName(),
featureStore,
null
);
loadModel( loadModel(
"powpularityS-model", "powpularityS-model",

View File

@ -139,9 +139,9 @@ public class TestExternalFeatures extends TestRerankBase {
final String docs0fvalias_dense_csv = FeatureLoggerTestUtils.toFeatureVector( final String docs0fvalias_dense_csv = FeatureLoggerTestUtils.toFeatureVector(
"occurrences","0.0", "occurrences","0.0",
"originalScore","0.0"); "originalScore","1.0");
final String docs0fvalias_sparse_csv = FeatureLoggerTestUtils.toFeatureVector( final String docs0fvalias_sparse_csv = FeatureLoggerTestUtils.toFeatureVector(
"originalScore","0.0"); "originalScore","1.0");
final String docs0fvalias_default_csv = chooseDefaultFeatureVector(docs0fvalias_dense_csv, docs0fvalias_sparse_csv); final String docs0fvalias_default_csv = chooseDefaultFeatureVector(docs0fvalias_dense_csv, docs0fvalias_sparse_csv);
@ -159,9 +159,9 @@ public class TestExternalFeatures extends TestRerankBase {
final String docs0fvalias_dense_csv = FeatureLoggerTestUtils.toFeatureVector( final String docs0fvalias_dense_csv = FeatureLoggerTestUtils.toFeatureVector(
"occurrences","0.0", "occurrences","0.0",
"originalScore","0.0"); "originalScore","1.0");
final String docs0fvalias_sparse_csv = FeatureLoggerTestUtils.toFeatureVector( final String docs0fvalias_sparse_csv = FeatureLoggerTestUtils.toFeatureVector(
"originalScore","0.0"); "originalScore","1.0");
final String docs0fvalias_default_csv = chooseDefaultFeatureVector(docs0fvalias_dense_csv, docs0fvalias_sparse_csv); final String docs0fvalias_default_csv = chooseDefaultFeatureVector(docs0fvalias_dense_csv, docs0fvalias_sparse_csv);