You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by er...@apache.org on 2012/01/06 02:26:01 UTC
svn commit: r1227926 - in /lucene/dev/branches/branch_3x/solr:
core/src/java/org/apache/solr/handler/admin/ core/src/test/org/apache/solr/
core/src/test/org/apache/solr/handler/admin/ webapp/web/admin/
Author: erick
Date: Fri Jan 6 01:26:01 2012
New Revision: 1227926
URL: http://svn.apache.org/viewvc?rev=1227926&view=rev
Log:
SOLR-1931, speeding up LukeRequestHandler
Modified:
lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java
lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java
lucene/dev/branches/branch_3x/solr/webapp/web/admin/schema.jsp
Modified: lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java?rev=1227926&r1=1227925&r2=1227926&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java (original)
+++ lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java Fri Jan 6 01:26:01 2012
@@ -20,15 +20,10 @@ package org.apache.solr.handler.admin;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
+
+import org.apache.commons.lang.BooleanUtils;
+import org.apache.lucene.index.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,10 +33,7 @@ import org.apache.lucene.document.Fielda
import org.apache.lucene.index.FieldInfo.IndexOptions;
import static org.apache.lucene.index.FieldInfo.IndexOptions.DOCS_ONLY;
import static org.apache.lucene.index.FieldInfo.IndexOptions.DOCS_AND_FREQS;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.index.TermEnum;
-import org.apache.lucene.index.TermFreqVector;
+
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.TopDocs;
@@ -89,7 +81,10 @@ public class LukeRequestHandler extends
public static final String NUMTERMS = "numTerms";
public static final String DOC_ID = "docId";
public static final String ID = "id";
+ public static final String REPORT_DOC_COUNT = "reportDocCount";
public static final int DEFAULT_COUNT = 10;
+
+ static final int HIST_ARRAY_SIZE = 33;
@Override
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception
@@ -99,9 +94,20 @@ public class LukeRequestHandler extends
IndexReader reader = searcher.getReader();
SolrParams params = req.getParams();
int numTerms = params.getInt( NUMTERMS, DEFAULT_COUNT );
-
+
// Always show the core lucene info
- rsp.add("index", getIndexInfo(reader, numTerms>0 ) );
+
+ Map<String, TopTermQueue> topTerms = new TreeMap<String, TopTermQueue>();
+
+ // If no doc is given, show all fields and top terms
+ Set<String> fields = null;
+ if( params.get( CommonParams.FL ) != null ) {
+ fields = new TreeSet<String>(Arrays.asList(params.getParams( CommonParams.FL ) ) );
+ }
+ if ( "schema".equals( params.get( "show" ))) {
+ numTerms = 0; // Abort any statistics gathering.
+ }
+ rsp.add("index", getIndexInfo(reader, numTerms, topTerms, fields ) );
Integer docId = params.getInt( DOC_ID );
if( docId == null && params.get( ID ) != null ) {
@@ -114,7 +120,6 @@ public class LukeRequestHandler extends
throw new SolrException( SolrException.ErrorCode.NOT_FOUND, "Can't find document: "+params.get( ID ) );
}
}
-
// Read the document from the index
if( docId != null ) {
Document doc = null;
@@ -138,21 +143,18 @@ public class LukeRequestHandler extends
rsp.add( "schema", getSchemaInfo( req.getSchema() ) );
}
else {
- // If no doc is given, show all fields and top terms
- Set<String> fields = null;
- if( params.get( CommonParams.FL ) != null ) {
- fields = new HashSet<String>();
- for( String f : params.getParams( CommonParams.FL ) ) {
- fields.add( f );
- }
- }
- rsp.add( "fields", getIndexedFieldsInfo( searcher, fields, numTerms ) ) ;
+ boolean reportDocCount = true;
+ String reportDoc = params.get(REPORT_DOC_COUNT, "false");
+ if ("1".equals(reportDoc)) reportDocCount = true;
+ else if ("0".equals(reportDoc)) reportDocCount = false;
+ else reportDocCount = BooleanUtils.toBoolean(reportDoc);
+ rsp.add( "fields", getIndexedFieldsInfo( searcher, fields, numTerms, topTerms, reportDocCount ) ) ;
}
// Add some generally helpful information
NamedList<Object> info = new SimpleOrderedMap<Object>();
info.add( "key", getFieldFlagsKey() );
- info.add( "NOTE", "Document Frequency (df) is not updated when a document is marked for deletion. df values include deleted documents." );
+ info.add( "NOTE", "Document Frequency (df) is not updated when a document is marked for deletion. df values include deleted documents." );
rsp.add( "info", info );
rsp.setHttpCaching(false);
}
@@ -284,26 +286,21 @@ public class LukeRequestHandler extends
@SuppressWarnings("unchecked")
private static SimpleOrderedMap<Object> getIndexedFieldsInfo(
- final SolrIndexSearcher searcher, final Set<String> fields, final int numTerms )
+ final SolrIndexSearcher searcher, final Set<String> fields, final int numTerms, Map<String,TopTermQueue> ttinfo,
+ boolean reportDocCount)
throws Exception {
IndexReader reader = searcher.getReader();
IndexSchema schema = searcher.getSchema();
// Walk the term enum and keep a priority queue for each map in our set
- Map<String,TopTermQueue> ttinfo = null;
- if( numTerms > 0 ) {
- ttinfo = getTopTerms(reader, fields, numTerms, null );
- }
SimpleOrderedMap<Object> finfo = new SimpleOrderedMap<Object>();
- Collection<String> fieldNames = reader.getFieldNames(IndexReader.FieldOption.ALL);
+ Set<String> fieldNames = new TreeSet<String>(reader.getFieldNames(IndexReader.FieldOption.ALL));
for (String fieldName : fieldNames) {
if( fields != null && !fields.contains( fieldName ) ) {
continue; // if a field is specified, only them
}
-
SimpleOrderedMap<Object> f = new SimpleOrderedMap<Object>();
-
SchemaField sfield = schema.getFieldOrNull( fieldName );
FieldType ftype = (sfield==null)?null:sfield.getType();
@@ -312,31 +309,48 @@ public class LukeRequestHandler extends
if (sfield != null && schema.isDynamicField(sfield.getName()) && schema.getDynamicPattern(sfield.getName()) != null) {
f.add("dynamicBase", schema.getDynamicPattern(sfield.getName()));
}
-
// If numTerms==0, the call is just asking for a quick field list
+ TopTermQueue topTerms = ttinfo.get( fieldName );
if( ttinfo != null && sfield != null && sfield.indexed() ) {
- Query q = new TermRangeQuery(fieldName,null,null,false,false);
- TopDocs top = searcher.search( q, 1 );
- if( top.totalHits > 0 ) {
- // Find a document with this field
- try {
- Document doc = searcher.doc( top.scoreDocs[0].doc );
- Fieldable fld = doc.getFieldable( fieldName );
- if( fld != null ) {
- f.add( "index", getFieldFlags( fld ) );
+ if (numTerms > 0) {
+ Document doc = null;
+ int totalHits = 0;
+ if (reportDocCount) {
+ Query q = new TermRangeQuery(fieldName, null, null, false, false);
+ TopDocs top = searcher.search(q, 1);
+ if (top.totalHits > 0) {
+ doc = searcher.doc(top.scoreDocs[0].doc);
+ totalHits = top.totalHits;
}
- else {
- // it is a non-stored field...
- f.add( "index", "(unstored field)" );
+ } else if (topTerms != null) {
+ TermDocs td = reader.termDocs();
+ td.seek(topTerms.getTopTerm());
+ if (td.next()) {
+ totalHits = 1;
+ doc = reader.document(td.doc());
}
}
- catch( Exception ex ) {
- log.warn( "error reading field: "+fieldName );
+
+ if (totalHits > 0) { // Doc won't be null if totalHits > 0
+ // Find a document with this field
+ try {
+ Fieldable fld = doc.getFieldable(fieldName);
+ if (fld != null) {
+ f.add("index", getFieldFlags(fld));
+ } else {
+ // it is a non-stored field...
+ f.add("index", "(unstored field)");
+ }
+ } catch (Exception ex) {
+ log.warn("error reading field: " + fieldName);
+ }
+ }
+ if (reportDocCount) {
+ f.add("docs", totalHits);
}
}
- f.add( "docs", top.totalHits );
-
- TopTermQueue topTerms = ttinfo.get( fieldName );
+
+
if( topTerms != null ) {
f.add( "distinct", topTerms.distinctTerms );
@@ -358,19 +372,21 @@ public class LukeRequestHandler extends
* Return info from the index
*/
private static SimpleOrderedMap<Object> getSchemaInfo( IndexSchema schema ) {
- Map<String, List<String>> typeusemap = new HashMap<String, List<String>>();
- SimpleOrderedMap<Object> fields = new SimpleOrderedMap<Object>();
+ Map<String, List<String>> typeusemap = new TreeMap<String, List<String>>();
+
+ Map<String, Object> fields = new TreeMap<String, Object>();
SchemaField uniqueField = schema.getUniqueKeyField();
for( SchemaField f : schema.getFields().values() ) {
populateFieldInfo(schema, typeusemap, fields, uniqueField, f);
}
- SimpleOrderedMap<Object> dynamicFields = new SimpleOrderedMap<Object>();
+ Map<String, Object> dynamicFields = new TreeMap<String, Object>();
for (SchemaField f : schema.getDynamicFieldPrototypes()) {
populateFieldInfo(schema, typeusemap, dynamicFields, uniqueField, f);
}
SimpleOrderedMap<Object> types = new SimpleOrderedMap<Object>();
- for( FieldType ft : schema.getFieldTypes().values() ) {
+ Map<String, FieldType> sortedTypes = new TreeMap<String, FieldType>(schema.getFieldTypes());
+ for( FieldType ft : sortedTypes.values() ) {
SimpleOrderedMap<Object> field = new SimpleOrderedMap<Object>();
field.add("fields", typeusemap.get( ft.getTypeName() ) );
field.add("tokenized", ft.isTokenized() );
@@ -380,10 +396,25 @@ public class LukeRequestHandler extends
types.add( ft.getTypeName(), field );
}
+
+ // Must go through this to maintain binary compatbility. Putting a TreeMap into a resp leads to casting errors
SimpleOrderedMap<Object> finfo = new SimpleOrderedMap<Object>();
+
+ SimpleOrderedMap<Object> fieldsSimple = new SimpleOrderedMap<Object>();
+ for (Map.Entry<String, Object> ent : fields.entrySet()) {
+ fieldsSimple.add(ent.getKey(), ent.getValue());
+ }
+ finfo.add("fields", fieldsSimple);
+
+ SimpleOrderedMap<Object> dynamicSimple = new SimpleOrderedMap<Object>();
+ for (Map.Entry<String, Object> ent : dynamicFields.entrySet()) {
+ dynamicSimple.add(ent.getKey(), ent.getValue());
+ }
+ finfo.add("dynamicFields", dynamicSimple);
+
finfo.add("fields", fields);
finfo.add("dynamicFields", dynamicFields);
- finfo.add("uniqueKeyField",
+ finfo.add("uniqueKeyField",
null == uniqueField ? null : uniqueField.getName());
finfo.add("defaultSearchField", schema.getDefaultSearchFieldName());
finfo.add("types", types);
@@ -434,7 +465,7 @@ public class LukeRequestHandler extends
}
private static void populateFieldInfo(IndexSchema schema,
- Map<String, List<String>> typeusemap, SimpleOrderedMap<Object> fields,
+ Map<String, List<String>> typeusemap, Map<String, Object> fields,
SchemaField uniqueField, SchemaField f) {
FieldType ft = f.getType();
SimpleOrderedMap<Object> field = new SimpleOrderedMap<Object>();
@@ -456,7 +487,7 @@ public class LukeRequestHandler extends
field.add("copySources", schema.getCopySources(f.getName()));
- fields.add( f.getName(), field );
+ fields.put(f.getName(), field);
List<String> v = typeusemap.get( ft.getTypeName() );
if( v == null ) {
@@ -465,29 +496,79 @@ public class LukeRequestHandler extends
v.add( f.getName() );
typeusemap.put( ft.getTypeName(), v );
}
-
- public static SimpleOrderedMap<Object> getIndexInfo( IndexReader reader, boolean countTerms ) throws IOException {
+ public static SimpleOrderedMap<Object> getIndexInfo(IndexReader reader, boolean countTerms) throws IOException {
+ return getIndexInfo(reader, countTerms ? 1 : 0, null, null);
+ }
+ public static SimpleOrderedMap<Object> getIndexInfo( IndexReader reader, int numTerms,
+ Map<String,TopTermQueue> topTerms,
+ Set<String> fields) throws IOException {
Directory dir = reader.directory();
SimpleOrderedMap<Object> indexInfo = new SimpleOrderedMap<Object>();
indexInfo.add("numDocs", reader.numDocs());
indexInfo.add("maxDoc", reader.maxDoc());
-
- if( countTerms ) {
- TermEnum te = null;
+ if( numTerms > 0 ) {
+ TermEnum terms = null;
try{
- te = reader.terms();
- int numTerms = 0;
- while (te.next()) {
- numTerms++;
+ terms = reader.terms();
+ int totalUniqueTerms = 0;
+ String lastField = "";
+ int[] buckets = new int[HIST_ARRAY_SIZE];
+ TopTermQueue tiq = null;
+ String field = "";
+ while (terms.next()) {
+ totalUniqueTerms++;
+ field = terms.term().field();
+
+ if (! field.equals(lastField)) {
+ // We're switching fields, wrap up the one we've just accumulated
+ // stats for and get ready for the next one.
+ if (tiq != null) {
+ // Histogram from last time through is the one to use
+ tiq.histogram.add(buckets);
+ topTerms.put(lastField, tiq);
+ tiq = null;
+ }
+ lastField = field;
+
+ // Skip fields not in fl list (if specified)
+ if (fields != null && !fields.contains(field)) {
+ continue;
+ }
+ tiq = new TopTermQueue(numTerms + 1);
+ for (int idx = 0; idx < buckets.length; ++idx) {
+ buckets[idx] = 0;
+ }
+ }
+ // When we're on a field we don't care about, tiq is null
+ if (tiq == null) {
+ continue;
+ }
+ int freq = terms.docFreq();
+ int slot = 32 - Integer.numberOfLeadingZeros(Math.max(0, freq - 1));
+ buckets[slot] = buckets[slot] + 1;
+ // Compute distinct terms for every field
+ tiq.distinctTerms++;
+
+ if( terms.docFreq() > tiq.minFreq ) {
+ tiq.add(new TopTermQueue.TermInfo(terms.term(), terms.docFreq()));
+ if (tiq.size() > numTerms) { // if tiq full
+ tiq.pop(); // remove lowest in tiq
+ tiq.minFreq = ((TopTermQueue.TermInfo)tiq.top()).docFreq; // reset minFreq
+ }
+ }
+ }
+ // We fall off the end and have to add the last field!
+ if (tiq != null) {
+ tiq.histogram.add(buckets);
+ topTerms.put(field, tiq);
}
- indexInfo.add("numTerms", numTerms );
+ indexInfo.add("numTerms", totalUniqueTerms );
}
finally{
- if( te != null ) te.close();
+ if( terms != null ) terms.close();
}
}
-
indexInfo.add("version", reader.getVersion()); // TODO? Is this different then: IndexReader.getCurrentVersion( dir )?
indexInfo.add("segmentCount", reader.getSequentialSubReaders().length);
indexInfo.add("current", reader.isCurrent() );
@@ -496,7 +577,6 @@ public class LukeRequestHandler extends
indexInfo.add("lastModified", new Date(IndexReader.lastModified(dir)) );
return indexInfo;
}
-
//////////////////////// SolrInfoMBeans methods //////////////////////
@Override
@@ -528,43 +608,25 @@ public class LukeRequestHandler extends
}
///////////////////////////////////////////////////////////////////////////////////////
-
- static class TermHistogram
+
+ static class TermHistogram
{
- int maxBucket = -1;
- public Map<Integer,Integer> hist = new HashMap<Integer, Integer>();
-
- private static final double LOG2 = Math.log( 2 );
- public static int getPowerOfTwoBucket( int num )
- {
- return Math.max(1, Integer.highestOneBit(num-1) << 1);
- }
-
- public void add( int df )
- {
- Integer bucket = getPowerOfTwoBucket( df );
- if( bucket > maxBucket ) {
- maxBucket = bucket;
- }
- Integer old = hist.get( bucket );
- if( old == null ) {
- hist.put( bucket, 1 );
+ int _maxBucket = -1;
+ int _buckets[] = new int[HIST_ARRAY_SIZE];
+ public void add(int[] buckets) {
+ for (int idx = 0; idx < buckets.length; ++idx) {
+ if (buckets[idx] != 0) _maxBucket = idx;
}
- else {
- hist.put( bucket, old+1 );
+ for (int idx = 0; idx <= _maxBucket; ++idx) {
+ _buckets[idx] = buckets[idx];
}
}
-
// TODO? should this be a list or a map?
public NamedList<Integer> toNamedList()
{
NamedList<Integer> nl = new NamedList<Integer>();
- for( int bucket = 1; bucket <= maxBucket; bucket *= 2 ) {
- Integer val = hist.get( bucket );
- if( val == null ) {
- val = 0;
- }
- nl.add( ""+bucket, val );
+ for( int bucket = 0; bucket <= _maxBucket; bucket++ ) {
+ nl.add( ""+ (1 << bucket), _buckets[bucket] );
}
return nl;
}
@@ -622,57 +684,8 @@ public class LukeRequestHandler extends
}
return list;
}
- }
-
- private static Map<String,TopTermQueue> getTopTerms( IndexReader reader, Set<String> fields, int numTerms, Set<String> junkWords ) throws Exception
- {
- Map<String,TopTermQueue> info = new HashMap<String, TopTermQueue>();
-
- TermEnum terms = null;
- try{
- terms = reader.terms();
- while (terms.next()) {
- String field = terms.term().field();
- String t = terms.term().text();
-
- // Compute distinct terms for every field
- TopTermQueue tiq = info.get( field );
- if( tiq == null ) {
- tiq = new TopTermQueue( numTerms+1 );
- info.put( field, tiq );
- }
- tiq.distinctTerms++;
- tiq.histogram.add( terms.docFreq() ); // add the term to the histogram
-
- // Only save the distinct terms for fields we worry about
- if (fields != null && fields.size() > 0) {
- if( !fields.contains( field ) ) {
- continue;
- }
- }
- if( junkWords != null && junkWords.contains( t ) ) {
- continue;
- }
-
- if( terms.docFreq() > tiq.minFreq ) {
- tiq.add(new TopTermQueue.TermInfo(terms.term(), terms.docFreq()));
- if (tiq.size() > numTerms) { // if tiq full
- tiq.pop(); // remove lowest in tiq
- tiq.minFreq = ((TopTermQueue.TermInfo)tiq.top()).docFreq; // reset minFreq
- }
- }
- }
- }
- finally {
- if( terms != null ) terms.close();
+ public Term getTopTerm() {
+ return ((TermInfo)top()).term;
}
- return info;
}
}
-
-
-
-
-
-
-
Modified: lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java?rev=1227926&r1=1227925&r2=1227926&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java (original)
+++ lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java Fri Jan 6 01:26:01 2012
@@ -88,7 +88,6 @@ public class MinimalSchemaTest extends S
req("qt", "/admin/luke",
"show","schema")
,"//int[@name='numDocs'][.='2']"
- ,"//int[@name='numTerms'][.='5']"
,"//null[@name='uniqueKeyField']"
,"//null[@name='defaultSearchField']"
);
Modified: lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java?rev=1227926&r1=1227925&r2=1227926&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java (original)
+++ lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java Fri Jan 6 01:26:01 2012
@@ -19,6 +19,7 @@ package org.apache.solr.handler.admin;
import org.apache.solr.common.luke.FieldFlag;
import org.apache.solr.util.AbstractSolrTestCase;
+import org.junit.Test;
import java.util.EnumSet;
import java.util.Arrays;
@@ -39,33 +40,31 @@ public class LukeRequestHandlerTest exte
}
/** tests some simple edge cases */
- public void doTestHistogramPowerOfTwoBucket() {
- assertHistoBucket(1, 1);
- assertHistoBucket(2, 2);
- assertHistoBucket(4, 3);
- assertHistoBucket(4, 4);
- assertHistoBucket(8, 5);
- assertHistoBucket(8, 6);
- assertHistoBucket(8, 7);
- assertHistoBucket(8, 8);
- assertHistoBucket(16, 9);
+ @Test
+ public void testHistogramBucket() {
+ assertHistoBucket(0, 1);
+ assertHistoBucket(1, 2);
+ assertHistoBucket(2, 3);
+ assertHistoBucket(2, 4);
+ assertHistoBucket(3, 5);
+ assertHistoBucket(3, 6);
+ assertHistoBucket(3, 7);
+ assertHistoBucket(3, 8);
+ assertHistoBucket(4, 9);
final int MAX_VALID = ((Integer.MAX_VALUE/2)+1)/2;
-
- assertHistoBucket(MAX_VALID, MAX_VALID-1 );
- assertHistoBucket(MAX_VALID, MAX_VALID );
- assertHistoBucket(MAX_VALID*2, MAX_VALID+1 );
-
- }
- private void assertHistoBucket(int expected, int in) {
- assertEquals("histobucket: " + in, expected,
- LukeRequestHandler.TermHistogram.getPowerOfTwoBucket( in ));
+ assertHistoBucket(29, MAX_VALID-1 );
+ assertHistoBucket(29, MAX_VALID );
+ assertHistoBucket(30, MAX_VALID+1 );
+
}
+ private void assertHistoBucket(int slot, int in) {
+ assertEquals("histobucket: " + in, slot, 32 - Integer.numberOfLeadingZeros(Math.max(0, in - 1)));
+ }
+ @Test
public void testLuke() {
- doTestHistogramPowerOfTwoBucket();
-
assertU(adoc("id","SOLR1000", "name","Apache Solr",
"solr_si", "10",
"solr_sl", "10",
@@ -125,6 +124,11 @@ public class LukeRequestHandlerTest exte
assertQ("Not as many index flags as expected ("+numFlags+") for " + f,
req("qt","/admin/luke", "fl", f),
numFlags+"=string-length("+xp+"[@name='index'])");
+
+ final String hxp = getFieldXPathHistogram(f);
+ assertQ("Historgram field should be present for field "+f,
+ req("qt", "/admin/luke", "fl", f),
+ hxp+"[@name='histogram']");
}
}
@@ -132,5 +136,9 @@ public class LukeRequestHandlerTest exte
private static String getFieldXPathPrefix(String field) {
return "//lst[@name='fields']/lst[@name='"+field+"']/str";
}
+
+ private static String getFieldXPathHistogram(String field) {
+ return "//lst[@name='fields']/lst[@name='"+field+"']/lst";
+ }
}
Modified: lucene/dev/branches/branch_3x/solr/webapp/web/admin/schema.jsp
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/webapp/web/admin/schema.jsp?rev=1227926&r1=1227925&r2=1227926&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/webapp/web/admin/schema.jsp (original)
+++ lucene/dev/branches/branch_3x/solr/webapp/web/admin/schema.jsp Fri Jan 6 01:26:01 2012
@@ -53,7 +53,20 @@
});
},
-
+ // get the reportDocCount parameter, could ask for others
+ getParamDefault: function(paramName, defaultVal) {
+ var searchString = window.location.search.substring(1),
+ i, val, params = searchString.split("&");
+
+ for (i=0;i<params.length;i++) {
+ val = params[i].split("=");
+ if (val[0] == paramName) {
+ return unescape(val[1]);
+ }
+ }
+ return defaultVal;
+ },
+
//load the Schema from the LukeRequestHandler
// this loads every field, and in each field the copy source/dests and flags
// we also load the list of field types, and the list of flags
@@ -114,7 +127,8 @@
//further populates the loaded schema with information gathered
// from the no argument LukeRequestHandler
loadFromLukeHandler: function(func) {
- $.getJSON(solr.pathToLukeHandler+'?wt=json', function(data) {
+
+ $.getJSON(solr.pathToLukeHandler+'?wt=json' + '&reportDocCount=' + solr.getParamDefault('reportDocCount', 'false'), function(data) {
$.each(data.fields, function(i, item) {
var field = solr.schemaFields[i];
@@ -183,7 +197,8 @@
if (isNaN(numTerms) || numTerms <=0 || numTerms.indexOf('.') != -1) {
return;
}
- $.getJSON(solr.pathToLukeHandler+'?fl='+fieldName+'&wt=json&numTerms='+numTerms, function(data) {
+
+ $.getJSON(solr.pathToLukeHandler+'?fl='+fieldName+'&wt=json&numTerms='+numTerms+'&reportDocCount=' + solr.getParamDefault('reportDocCount', 'false'), function(data) {
solr.schemaFields[fieldName]['topTerms'] = solr.lukeArrayToHash(data.fields[fieldName].topTerms);
if ($.isFunction(func)) {
func(solr.schemaFields[fieldName]['topTerms'], fieldName);