diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java index 958d16d98b1..d0da654e63b 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java @@ -21,7 +21,6 @@ import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.index.*; -import org.apache.lucene.index.AtomicReaderContext; import org.apache.lucene.search.*; import org.apache.lucene.util.Bits; import org.apache.lucene.util.BytesRef; @@ -234,9 +233,17 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore "QueryElevationComponent must specify argument: " + CONFIG_FILE); } log.info("Loading QueryElevation from data dir: " + f); - - InputStream is = VersionedFile.getLatestFile(core.getDataDir(), f); - Config cfg = new Config(core.getResourceLoader(), f, new InputSource(is), null); + + Config cfg; + + ZkController zkController = core.getCoreDescriptor().getCoreContainer().getZkController(); + if (zkController != null) { + cfg = new Config(core.getResourceLoader(), f, null, null); + } else { + InputStream is = VersionedFile.getLatestFile(core.getDataDir(), f); + cfg = new Config(core.getResourceLoader(), f, new InputSource(is), null); + } + map = loadElevationMap(cfg); elevationCache.put(reader, map); } @@ -392,7 +399,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore SortSpec sortSpec = rb.getSortSpec(); if (sortSpec.getSort() == null) { sortSpec.setSort(new Sort(new SortField[]{ - new SortField(idField, comparator, false), + new SortField("_elevate_", comparator, true), new SortField(null, SortField.Type.SCORE, false) })); } else { @@ -402,12 +409,12 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore ArrayList sorts = new ArrayList(current.length + 1); // Perhaps force it to always sort by score if (force && current[0].getType() != SortField.Type.SCORE) { - sorts.add(new SortField(idField, comparator, false)); + sorts.add(new SortField("_elevate_", comparator, true)); modify = true; } for (SortField sf : current) { if (sf.getType() == SortField.Type.SCORE) { - sorts.add(new SortField(idField, comparator, sf.getReverse())); + sorts.add(new SortField("_elevate_", comparator, !sf.getReverse())); modify = true; } sorts.add(sf); @@ -491,7 +498,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore } @Override - public FieldComparator newComparator(final String fieldname, final int numHits, int sortPos, boolean reversed) throws IOException { + public FieldComparator newComparator(String fieldname, final int numHits, int sortPos, boolean reversed) throws IOException { return new FieldComparator() { private final int[] values = new int[numHits]; private int bottomVal; @@ -501,7 +508,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore @Override public int compare(int slot1, int slot2) { - return values[slot2] - values[slot1]; // values will be small enough that there is no overflow concern + return values[slot1] - values[slot2]; // values will be small enough that there is no overflow concern } @Override @@ -523,7 +530,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore @Override public int compareBottom(int doc) throws IOException { - return docVal(doc) - bottomVal; + return bottomVal - docVal(doc); } @Override @@ -537,7 +544,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore ordSet.clear(); Fields fields = context.reader().fields(); if (fields == null) return this; - Terms terms = fields.terms(fieldname); + Terms terms = fields.terms(idField); if (terms == null) return this; termsEnum = terms.iterator(termsEnum); BytesRef term = new BytesRef(); diff --git a/solr/core/src/test-files/solr/conf/elevate.xml b/solr/core/src/test-files/solr/conf/elevate.xml index 66eb41bdc5a..d15bd5eb6fc 100644 --- a/solr/core/src/test-files/solr/conf/elevate.xml +++ b/solr/core/src/test-files/solr/conf/elevate.xml @@ -42,5 +42,8 @@ + + + diff --git a/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryElevationComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryElevationComponentTest.java new file mode 100644 index 00000000000..9c1dcb810c7 --- /dev/null +++ b/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryElevationComponentTest.java @@ -0,0 +1,94 @@ +package org.apache.solr.handler.component; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.File; +import java.io.IOException; + +import org.apache.solr.BaseDistributedSearchTestCase; +import org.apache.solr.common.SolrInputDocument; +import org.apache.solr.common.params.CommonParams; +import org.apache.solr.common.util.FileUtils; +import org.junit.BeforeClass; + +/** + * + */ +public class DistributedQueryElevationComponentTest extends BaseDistributedSearchTestCase { + + public DistributedQueryElevationComponentTest() { + fixShardCount = true; + shardCount = 3; + stress = 0; + + // TODO: a better way to do this? + configString = "solrconfig-elevate.xml"; + schemaString = "schema11.xml"; + } + + @BeforeClass + public static void beforeClass() throws IOException { + File parent = new File(TEST_HOME(), "conf"); + File elevateFile = new File(parent, "elevate.xml"); + File elevateDataFile = new File(parent, "elevate-data.xml"); + FileUtils.copyFile(elevateFile, elevateDataFile); + } + + @Override + public void doTest() throws Exception { + + + del("*:*"); + indexr(id,"1", "int_i", "1", "text", "XXXX XXXX", "field_t", "anything"); + indexr(id,"2", "int_i", "2", "text", "YYYY YYYY", "plow_t", "rake"); + indexr(id,"3", "int_i", "3", "text", "ZZZZ ZZZZ"); + indexr(id,"4", "int_i", "4", "text", "XXXX XXXX"); + indexr(id,"5", "int_i", "5", "text", "ZZZZ ZZZZ ZZZZ"); + indexr(id,"6", "int_i", "6", "text", "ZZZZ"); + + index_specific(2, id, "7", "int_i", "7", "text", "solr"); + commit(); + + handle.put("explain", SKIPVAL); + handle.put("debug", SKIPVAL); + handle.put("QTime", SKIPVAL); + handle.put("maxScore", SKIPVAL); + handle.put("timestamp", SKIPVAL); + handle.put("score", SKIPVAL); + handle.put("wt", SKIP); + handle.put("distrib", SKIP); + handle.put("shards.qt", SKIP); + handle.put("shards", SKIP); + handle.put("q", SKIP); + handle.put("qt", SKIP); + query("q", "*:*", "qt", "/elevate", "shards.qt", "/elevate", "rows", "500", "sort", "id desc", CommonParams.FL, "id, score, [elevated]"); + + query("q", "ZZZZ", "qt", "/elevate", "shards.qt", "/elevate", "rows", "500", CommonParams.FL, "*, [elevated]", "forceElevation", "true", "sort", "int_i desc"); + + query("q", "solr", "qt", "/elevate", "shards.qt", "/elevate", "rows", "500", CommonParams.FL, "*, [elevated]", "forceElevation", "true", "sort", "int_i asc"); + + query("q", "ZZZZ", "qt", "/elevate", "shards.qt", "/elevate", "rows", "500", CommonParams.FL, "*, [elevated]", "forceElevation", "true", "sort", "id desc"); + } + + protected void indexr(Object... fields) throws Exception { + SolrInputDocument doc = new SolrInputDocument(); + addFields(doc, fields); + indexDoc(doc); + } + +} diff --git a/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java index 352e520073c..68cd3373565 100644 --- a/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java +++ b/solr/core/src/test/org/apache/solr/handler/component/QueryElevationComponentTest.java @@ -157,7 +157,7 @@ public class QueryElevationComponentTest extends SolrTestCaseJ4 { req.close(); // Make sure the boosts loaded properly - assertEquals(5, map.size()); + assertEquals(6, map.size()); assertEquals(1, map.get("XXXX").priority.size()); assertEquals(2, map.get("YYYY").priority.size()); assertEquals(3, map.get("ZZZZ").priority.size()); @@ -174,7 +174,7 @@ public class QueryElevationComponentTest extends SolrTestCaseJ4 { comp.init(args); comp.inform(core); map = comp.getElevationMap(reader, core); - assertEquals(5, map.size()); + assertEquals(6, map.size()); assertEquals(null, map.get("XXXX")); assertEquals(null, map.get("YYYY")); assertEquals(null, map.get("ZZZZ"));