mirror of https://github.com/apache/lucene.git
SOLR-2949: distrib support for QEC
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1302541 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
0fedad4ad4
commit
2460ae1647
|
@ -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;
|
||||
|
@ -235,8 +234,16 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore
|
|||
}
|
||||
log.info("Loading QueryElevation from data dir: " + f);
|
||||
|
||||
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);
|
||||
Config cfg = new Config(core.getResourceLoader(), f, new InputSource(is), null);
|
||||
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<SortField> sorts = new ArrayList<SortField>(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<Integer> newComparator(final String fieldname, final int numHits, int sortPos, boolean reversed) throws IOException {
|
||||
public FieldComparator<Integer> newComparator(String fieldname, final int numHits, int sortPos, boolean reversed) throws IOException {
|
||||
return new FieldComparator<Integer>() {
|
||||
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();
|
||||
|
|
|
@ -42,5 +42,8 @@
|
|||
<doc id="6" exclude="true" />
|
||||
</query>
|
||||
|
||||
<query text="solr">
|
||||
<doc id="7" />
|
||||
</query>
|
||||
|
||||
</elevate>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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"));
|
||||
|
|
Loading…
Reference in New Issue