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:
Yonik Seeley 2012-03-19 17:08:08 +00:00
parent 0fedad4ad4
commit 2460ae1647
4 changed files with 117 additions and 13 deletions

View File

@ -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();

View File

@ -42,5 +42,8 @@
<doc id="6" exclude="true" />
</query>
<query text="solr">
<doc id="7" />
</query>
</elevate>

View File

@ -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);
}
}

View File

@ -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"));