You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ry...@apache.org on 2012/02/11 03:55:45 UTC
svn commit: r1242998 - in /lucene/dev/trunk/solr:
core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
webapp/web/js/script.js webapp/web/tpl/dashboard.html
webapp/web/tpl/schema-browser.html
Author: ryan
Date: Sat Feb 11 02:55:45 2012
New Revision: 1242998
URL: http://svn.apache.org/viewvc?rev=1242998&view=rev
Log:
SOLR-3121: (admin UI) load term info dynamically for each field
Modified:
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
lucene/dev/trunk/solr/webapp/web/js/script.js
lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html
lucene/dev/trunk/solr/webapp/web/tpl/schema-browser.html
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java?rev=1242998&r1=1242997&r2=1242998&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java Sat Feb 11 02:55:45 2012
@@ -31,13 +31,13 @@ import org.apache.lucene.store.Directory
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.PriorityQueue;
-import org.apache.lucene.util.ReaderUtil;
import org.apache.lucene.util.UnicodeUtil;
import org.apache.solr.analysis.CharFilterFactory;
import org.apache.solr.analysis.TokenFilterFactory;
import org.apache.solr.analysis.TokenizerChain;
import org.apache.solr.analysis.TokenizerFactory;
import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.luke.FieldFlag;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.SolrParams;
@@ -84,6 +84,23 @@ public class LukeRequestHandler extends
public static final int DEFAULT_COUNT = 10;
static final int HIST_ARRAY_SIZE = 33;
+
+ private static enum ShowStyle {
+ ALL,
+ DOC,
+ SCHEMA,
+ INDEX;
+
+ public static ShowStyle get(String v) {
+ if(v==null) return null;
+ if("schema".equals(v)) return SCHEMA;
+ if("index".equals(v)) return INDEX;
+ if("doc".equals(v)) return DOC;
+ if("all".equals(v)) return ALL;
+ throw new SolrException(ErrorCode.BAD_REQUEST, "Unknown Show Style: "+v);
+ }
+ };
+
@Override
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception
@@ -93,6 +110,7 @@ public class LukeRequestHandler extends
DirectoryReader reader = searcher.getIndexReader();
SolrParams params = req.getParams();
int numTerms = params.getInt( NUMTERMS, DEFAULT_COUNT );
+ ShowStyle style = ShowStyle.get(params.get("show"));
// Always show the core lucene info
Map<String, TopTermQueue> topTerms = new TreeMap<String, TopTermQueue>();
@@ -103,12 +121,17 @@ public class LukeRequestHandler extends
if (fl != null) {
fields = new TreeSet<String>(Arrays.asList(fl.split( "[,\\s]+" )));
}
-
- if ( "schema".equals( params.get( "show" ))) {
+ if( ShowStyle.SCHEMA == style ) {
numTerms = 0; // Abort any statistics gathering.
}
- rsp.add("index", getIndexInfo(reader, numTerms, topTerms, fields ));
+ rsp.add("index", getIndexInfo(reader, numTerms, topTerms, fields ));
+
+ if(ShowStyle.INDEX==style) {
+ return; // thats all we need
+ }
+
+
Integer docId = params.getInt( DOC_ID );
if( docId == null && params.get( ID ) != null ) {
// Look for something with a given solr ID
@@ -123,6 +146,9 @@ public class LukeRequestHandler extends
// Read the document from the index
if( docId != null ) {
+ if( style != null && style != ShowStyle.DOC ) {
+ throw new SolrException(ErrorCode.BAD_REQUEST, "missing doc param for doc style");
+ }
Document doc = null;
try {
doc = reader.document( docId );
@@ -140,7 +166,7 @@ public class LukeRequestHandler extends
docinfo.add( "solr", doc );
rsp.add( "doc", docinfo );
}
- else if ( "schema".equals( params.get( "show" ) ) ) {
+ else if ( ShowStyle.SCHEMA == style ) {
rsp.add( "schema", getSchemaInfo( req.getSchema() ) );
}
else {
@@ -559,11 +585,13 @@ public class LukeRequestHandler extends
indexInfo.add("numTerms", (new Long(totalTerms)).intValue());
}
+
indexInfo.add("version", reader.getVersion()); // TODO? Is this different then: IndexReader.getCurrentVersion( dir )?
indexInfo.add("segmentCount", reader.getSequentialSubReaders().length);
indexInfo.add("current", reader.isCurrent() );
indexInfo.add("hasDeletions", reader.hasDeletions() );
indexInfo.add("directory", dir );
+ indexInfo.add("userData", reader.getIndexCommit().getUserData());
String s = reader.getIndexCommit().getUserData().get(SolrIndexWriter.COMMIT_TIME_MSEC_KEY);
if (s != null) {
indexInfo.add("lastModified", new Date(Long.parseLong(s)));
Modified: lucene/dev/trunk/solr/webapp/web/js/script.js
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/js/script.js?rev=1242998&r1=1242997&r2=1242998&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/js/script.js (original)
+++ lucene/dev/trunk/solr/webapp/web/js/script.js Sat Feb 11 02:55:45 2012
@@ -1766,7 +1766,7 @@ var sammy = $.sammy
$.ajax
(
{
- url : core_basepath + '/admin/luke?numTerms=50&wt=json',
+ url : core_basepath + '/admin/luke?numTerms=0&wt=json',
dataType : 'json',
beforeSend : function( xhr, settings )
{
@@ -1860,28 +1860,6 @@ var sammy = $.sammy
for( var field in app.schema_browser_data.fields )
{
- if( app.schema_browser_data.fields[field].histogram )
- {
- var histogram = app.schema_browser_data.fields[field].histogram;
-
- app.schema_browser_data.fields[field].histogram =
- luke_array_to_struct( histogram );
-
- app.schema_browser_data.fields[field].histogram_hash =
- luke_array_to_hash( histogram );
- }
-
- if( app.schema_browser_data.fields[field].topTerms )
- {
- var top_terms = app.schema_browser_data.fields[field].topTerms;
-
- app.schema_browser_data.fields[field].topTerms =
- luke_array_to_struct( top_terms );
-
- app.schema_browser_data.fields[field].topTerms_hash =
- luke_array_to_hash( top_terms );
- }
-
if( app.schema_browser_data.fields[field].copySourcesRaw )
{
var copy_sources = app.schema_browser_data.fields[field].copySourcesRaw;
@@ -2375,154 +2353,221 @@ var sammy = $.sammy
}
}
}
+
+ var terminfo_element = $( '.terminfo-holder', data_element );
+
+ if( is_f ) {
+ // ideally we would have a checkbox to enable loading topterms
+ // stored as a cookie? so it stays the same
+ // TopTerms on a big index is really a DOS attack!
+
+ core_basepath = "/solr"; // TODO?????
+ var status_holder_element = $( '.status-holder', terminfo_element );
+ var topterms_holder_element = $( '.topterms-holder', terminfo_element );
+ var histogram_holder_element = $( '.histogram-holder', terminfo_element );
+ topterms_holder_element.hide();
+ histogram_holder_element.hide();
+
+ $.ajax
+ (
+ {
+ url : core_basepath + '/admin/luke?numTerms=50&wt=json&fl=' + field,
+ dataType : 'json',
+ context : status_holder_element,
+ beforeSend : function( xhr, settings )
+ {
+ this.show();
+ this
+ .html( '<div value="">Loading Term Info... </div>' )
+ .addClass( 'loader' );
+ },
+ success : function( response, text_status, xhr )
+ {
+ var finfo = response['fields'][field];
+ if( finfo ) {
+ this
+ .html( '<div value=""><b>'+field+'</b> in '+finfo['docs']+' docs. '+finfo['distinct']+' distinct terms.</div><br/>' )
+ .removeClass( 'loader' );
+
+ console.log(finfo);
+
+ // TODO!!! this is duplicate code!!!!
+ var luke_array_to_struct = function( array )
+ {
+ var struct = {
+ keys : [],
+ values : []
+ };
+ for( var i = 0; i < array.length; i += 2 )
+ {
+ struct.keys.push( array[i] );
+ struct.values.push( array[i+1] );
+ }
+ return struct;
+ }
- var topterms_holder_element = $( '.topterms-holder', data_element );
- if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].topTerms_hash )
- {
- topterms_holder_element
- .show();
-
- var topterms_table_element = $( 'table', topterms_holder_element );
-
- var topterms_navi_less = $( 'p.navi .less', topterms_holder_element );
- var topterms_navi_more = $( 'p.navi .more', topterms_holder_element );
-
- var topterms_count = schema_browser_data.fields[field].topTerms.keys.length;
- var topterms_hash = schema_browser_data.fields[field].topTerms_hash;
- var topterms_content = '<tbody>';
-
- var i = 1;
- for( var term in topterms_hash )
- {
- topterms_content += '<tr>' + "\n" +
- '<td class="position">' + i + '</td>' + "\n" +
- '<td class="term">' + term + '</td>' + "\n" +
- '<td class="frequency">' + topterms_hash[term] + '</td>' + "\n" +
- '</tr>' + "\n";
-
- if( i !== topterms_count && 0 === i % 10 )
- {
- topterms_content += '</tbody><tbody>';
- }
-
- i++;
- }
-
- topterms_content += '</tbody>';
-
- topterms_table_element
- .empty()
- .append( topterms_content );
-
- $( 'tbody', topterms_table_element )
- .die( 'change' )
- .live
- (
- 'change',
- function()
- {
- var blocks = $( 'tbody', topterms_table_element );
- var visible_blocks = blocks.filter( ':visible' );
- var hidden_blocks = blocks.filter( ':hidden' );
-
- $( 'p.head .shown', topterms_holder_element )
- .html( $( 'tr', visible_blocks ).size() );
-
- 0 < hidden_blocks.size()
- ? topterms_navi_more.show()
- : topterms_navi_more.hide();
-
- 1 < visible_blocks.size()
- ? topterms_navi_less.show()
- : topterms_navi_less.hide();
- }
- );
-
- $( 'tbody tr:odd', topterms_table_element )
- .addClass( 'odd' );
-
- $( 'tbody:first', topterms_table_element )
- .show()
- .trigger( 'change' );
-
- $( 'p.head .max', topterms_holder_element )
- .html( schema_browser_data.fields[field].distinct );
-
- topterms_navi_less
- .die( 'click' )
- .live
- (
- 'click',
- function( event )
- {
- $( 'tbody:visible', topterms_table_element ).last()
- .hide()
- .trigger( 'change' );
- }
- );
-
- topterms_navi_more
- .die( 'click' )
- .live
- (
- 'click',
- function( event )
- {
- $( 'tbody:hidden', topterms_table_element ).first()
+ var luke_array_to_hash = function( array )
+ {
+ var hash = {};
+ for( var i = 0; i < array.length; i += 2 )
+ {
+ hash[ array[i] ] = array[i+1];
+ }
+ return hash;
+ }
+
+
+ if( finfo.histogram )
+ {
+ var histogram = luke_array_to_struct( finfo.histogram );
+ var histogram_values = luke_array_to_hash ( finfo.histogram );
+
+ histogram_holder_element.show();
+
+ var histogram_element = $( '.histogram', histogram_holder_element );
+
+ var histogram_legend = '';
+
+ for( var key in histogram_values )
+ {
+ histogram_legend += '<dt><span>' + key + '</span></dt>' + "\n" +
+ '<dd title="' + key + '">' +
+ '<span>' + histogram_values[key] + '</span>' +
+ '</dd>' + "\n";
+ }
+
+ $( 'dl', histogram_holder_element )
+ .html( histogram_legend );
+
+ histogram_element.sparkline
+ (
+ histogram.values,
+ {
+ type : 'bar',
+ barColor : '#c0c0c0',
+ zeroColor : '#ffffff',
+ height : histogram_element.height(),
+ barWidth : 46,
+ barSpacing : 3
+ }
+ );
+ }
+
+ if( finfo.topTerms )
+ {
+ var topterms = luke_array_to_struct( finfo.topTerms );
+ var topterms_hash = luke_array_to_hash ( finfo.topTerms );
+ var topterms_count = topterms.keys.length;
+
+ topterms_holder_element.show();
+
+ var topterms_table_element = $( 'table', topterms_holder_element );
+
+ var topterms_navi_less = $( 'p.navi .less', topterms_holder_element );
+ var topterms_navi_more = $( 'p.navi .more', topterms_holder_element );
+
+ var topterms_content = '<tbody>';
+
+ var i = 1;
+ for( var term in topterms_hash )
+ {
+ topterms_content += '<tr>' + "\n" +
+ '<td class="position">' + i + '</td>' + "\n" +
+ '<td class="term">' + term + '</td>' + "\n" +
+ '<td class="frequency">' + topterms_hash[term] + '</td>' + "\n" +
+ '</tr>' + "\n";
+
+ if( i !== topterms_count && 0 === i % 10 )
+ {
+ topterms_content += '</tbody><tbody>';
+ }
+
+ i++;
+ }
+
+ topterms_content += '</tbody>';
+
+ topterms_table_element
+ .empty()
+ .append( topterms_content );
+
+ $( 'tbody', topterms_table_element )
+ .die( 'change' )
+ .live
+ (
+ 'change',
+ function()
+ {
+ var blocks = $( 'tbody', topterms_table_element );
+ var visible_blocks = blocks.filter( ':visible' );
+ var hidden_blocks = blocks.filter( ':hidden' );
+
+ $( 'p.head .shown', topterms_holder_element )
+ .html( $( 'tr', visible_blocks ).size() );
+
+ 0 < hidden_blocks.size()
+ ? topterms_navi_more.show()
+ : topterms_navi_more.hide();
+
+ 1 < visible_blocks.size()
+ ? topterms_navi_less.show()
+ : topterms_navi_less.hide();
+ }
+ );
+
+ $( 'tbody tr:odd', topterms_table_element )
+ .addClass( 'odd' );
+
+ $( 'tbody:first', topterms_table_element )
.show()
.trigger( 'change' );
+
+ $( 'p.head .max', topterms_holder_element )
+ .html( schema_browser_data.fields[field].distinct );
+
+ topterms_navi_less
+ .die( 'click' )
+ .live
+ (
+ 'click',
+ function( event )
+ {
+ $( 'tbody:visible', topterms_table_element ).last()
+ .hide()
+ .trigger( 'change' );
+ }
+ );
+
+ topterms_navi_more
+ .die( 'click' )
+ .live
+ (
+ 'click',
+ function( event )
+ {
+ $( 'tbody:hidden', topterms_table_element ).first()
+ .show()
+ .trigger( 'change' );
+ }
+ );
+ } // end has Top Terms
}
- );
- }
- else
- {
- topterms_holder_element
- .hide();
- }
-
- var histogram_holder_element = $( '.histogram-holder', data_element );
- if( is_f && schema_browser_data.fields[field] && schema_browser_data.fields[field].histogram_hash )
- {
- histogram_holder_element
- .show();
-
- var histogram_element = $( '.histogram', histogram_holder_element );
-
- var histogram_values = schema_browser_data.fields[field].histogram_hash;
- var histogram_legend = '';
-
- histogram_holder_element
- .show();
-
- for( var key in histogram_values )
- {
- histogram_legend += '<dt><span>' + key + '</span></dt>' + "\n" +
- '<dd title="' + key + '">' +
- '<span>' + histogram_values[key] + '</span>' +
- '</dd>' + "\n";
- }
-
- $( 'dl', histogram_holder_element )
- .html( histogram_legend );
-
- histogram_element
- .sparkline
- (
- schema_browser_data.fields[field].histogram.values,
- {
- type : 'bar',
- barColor : '#c0c0c0',
- zeroColor : '#ffffff',
- height : histogram_element.height(),
- barWidth : 46,
- barSpacing : 3
+ else {
+ terminfo_element.hide();
}
- );
+ },
+ error : function( xhr, text_status, error_thrown)
+ {
+ terminfo_element.hide();
+ },
+ complete : function( xhr, text_status )
+ {
+ }
+ }
+ );
}
- else
- {
- histogram_holder_element
- .hide();
+ else {
+ terminfo_element.hide();
}
}
@@ -3870,7 +3915,7 @@ var sammy = $.sammy
$.ajax
(
{
- url : core_basepath + '/admin/luke?wt=json',
+ url : core_basepath + '/admin/luke?wt=json&show=index&numTerms=0',
dataType : 'json',
context : $( '#statistics', dashboard_element ),
beforeSend : function( xhr, settings )
@@ -3897,6 +3942,8 @@ var sammy = $.sammy
var data = {
'index_num-docs' : response['index']['numDocs'],
'index_max-doc' : response['index']['maxDoc'],
+ 'index_version' : response['index']['version'],
+ 'index_segmentCount' : response['index']['segmentCount'],
'index_last-modified' : response['index']['lastModified']
};
@@ -3910,7 +3957,7 @@ var sammy = $.sammy
}
var optimized_element = $( '.value.index_optimized', this );
- if( response['index']['optimized'] )
+ if( !response['index']['hasDeletions'] )
{
optimized_element
.addClass( 'ico-1' );
@@ -3945,20 +3992,6 @@ var sammy = $.sammy
.html( 'no' );
}
- var deletions_element = $( '.value.index_has-deletions', this );
- if( response['index']['hasDeletions'] )
- {
- deletions_element.prev()
- .show();
-
- deletions_element
- .show()
- .addClass( 'ico-0' );
-
- $( 'span', deletions_element )
- .html( 'yes' );
- }
-
$( 'a', optimized_element )
.die( 'click' )
.live
Modified: lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html?rev=1242998&r1=1242997&r2=1242998&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html (original)
+++ lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html Sat Feb 11 02:55:45 2012
@@ -14,25 +14,28 @@
<dl>
- <dt class="index_last-modified">lastModified:</dt>
+ <dt class="index_last-modified">Last Modified:</dt>
<dd class="index_last-modified value timeago"></dd>
- <dt class="index_num-docs">numDocs:</dt>
+ <dt class="index_num-docs">Num Docs:</dt>
<dd class="index_num-docs value"></dd>
- <dt class="index_max-doc">maxDoc:</dt>
+ <dt class="index_max-doc">Max Doc:</dt>
<dd class="index_max-doc value"></dd>
- <dt class="index_optimized">optimized:</dt>
+ <dt class="index_version">Version:</dt>
+ <dd class="index_version value"></dd>
+
+ <dt class="index_segmentCount">Segment Count:</dt>
+ <dd class="index_segmentCount value"></dd>
+
+ <dt class="index_optimized">Optimized:</dt>
<dd class="index_optimized value ico"><span></span>
<a>optimize now</a></dd>
- <dt class="index_current">current:</dt>
+ <dt class="index_current">Current:</dt>
<dd class="index_current value ico"><span></span></dd>
-
- <dt class="index_has-deletions">deletions:</dt>
- <dd class="index_has-deletions value ico"><span></span></dd>
-
+
</dl>
</div>
Modified: lucene/dev/trunk/solr/webapp/web/tpl/schema-browser.html
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/tpl/schema-browser.html?rev=1242998&r1=1242997&r2=1242998&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/tpl/schema-browser.html (original)
+++ lucene/dev/trunk/solr/webapp/web/tpl/schema-browser.html Sat Feb 11 02:55:45 2012
@@ -50,7 +50,7 @@
</li>
<li class="clearfix query">
- <p>Query Analyzer:</p>
+ <p>Query Analyzer:</p>
<dl>
<dt></dt>
</dl>
@@ -58,13 +58,11 @@
<ul>
<li class="clearfix tokenizer">
<p>Tokenizer:</p>
- <dl>
- </dl>
+ <dl></dl>
</li>
<li class="clearfix filters">
<p>Filters:</p>
- <dl>
- </dl>
+ <dl></dl>
</li>
</ul>
@@ -72,46 +70,50 @@
</ul>
</div>
-
- <div class="topterms-holder">
-
- <p class="head">Top <span class="shown"></span><span class="max-holder">/<span class="max"></span></span> Terms:</p>
-
- <table border="0" cellspacing="0" cellpadding="0">
-
- <thead>
-
- <tr>
-
- <th class="position" title="Position"> </th>
- <th class="term">Term</th>
- <th class="frequency" title="Frequency">Frq</th>
-
- </tr>
-
- </thead>
-
- </table>
-
- <p class="navi clearfix">
- <a class="less"><span>less</span></a>
- <a class="more"><span>more</span></a>
- </p>
-
- </div>
-
- <div class="histogram-holder">
-
- <p class="head">Histogram:</p>
-
- <div class="histogram"></div>
-
- <dl class="clearfix">
-
- </dl>
+ <div class="terminfo-holder">
+ <div class="status-holder">Load Term Info</div>
+
+ <div class="topterms-holder">
+
+ <p class="head">Top <span class="shown"></span><span class="max-holder">/<span class="max"></span></span> Terms:</p>
+
+ <table border="0" cellspacing="0" cellpadding="0">
+
+ <thead>
+
+ <tr>
+
+ <th class="position" title="Position"> </th>
+ <th class="term">Term</th>
+ <th class="frequency" title="Frequency">Frq</th>
+
+ </tr>
+
+ </thead>
+
+ </table>
+
+ <p class="navi clearfix">
+ <a class="less"><span>less</span></a>
+ <a class="more"><span>more</span></a>
+ </p>
+
+ </div>
+
+ <div class="histogram-holder">
+
+ <p class="head">Histogram:</p>
+
+ <div class="histogram"></div>
+
+ <dl class="clearfix">
+
+ </dl>
+
+ </div>
</div>
-
+
</div>
</div>