reverting analysis.jsp changes from SOLR-58

git-svn-id: https://svn.apache.org/repos/asf/incubator/solr/trunk@487639 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yonik Seeley 2006-12-15 19:53:39 +00:00
parent 9d29a06cf5
commit 94aa557d88
1 changed files with 215 additions and 81 deletions

View File

@ -1,4 +1,4 @@
<%@ page contentType="text/xml; charset=utf-8" pageEncoding="UTF-8" language="java" %>
<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
<%--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@ -30,86 +30,129 @@
<%@ page import="java.io.StringReader"%>
<%@ page import="java.util.*"%>
<?xml-stylesheet type="text/xsl" href="analysis.xsl"?>
<%-- $Id$ --%>
<%-- $Source: /cvs/main/searching/org.apache.solrolarServer/resources/admin/analysis.jsp,v $ --%>
<%-- $Name: $ --%>
<%@include file="_info.jsp" %>
<%@include file="header.jsp" %>
<%
String name = request.getParameter("name");
if (name == null || name.length() == 0) name = "";
if (name==null || name.length()==0) name="";
String val = request.getParameter("val");
if (val == null || val.length() == 0) val = "";
if (val==null || val.length()==0) val="";
String qval = request.getParameter("qval");
if (qval == null || qval.length() == 0) qval = "";
if (qval==null || qval.length()==0) qval="";
String verboseS = request.getParameter("verbose");
boolean verbose = verboseS != null && verboseS.equalsIgnoreCase("on");
boolean verbose = verboseS!=null && verboseS.equalsIgnoreCase("on");
String qverboseS = request.getParameter("qverbose");
boolean qverbose = qverboseS != null && qverboseS.equalsIgnoreCase("on");
boolean qverbose = qverboseS!=null && qverboseS.equalsIgnoreCase("on");
String highlightS = request.getParameter("highlight");
boolean highlight = highlightS != null && highlightS.equalsIgnoreCase("on");
boolean highlight = highlightS!=null && highlightS.equalsIgnoreCase("on");
%>
<solr>
<%@include file="heading.jsp" %>
<analysis>
<br clear="all">
<h2>Field Analysis</h2>
<form method="GET" action="analysis.jsp">
<table>
<tr>
<td>
<strong>Field name</strong>
</td>
<td>
<input class="std" name="name" type="text" value="<%= name %>">
</td>
</tr>
<tr>
<td>
<strong>Field value (Index)</strong>
<br/>
verbose output
<input name="verbose" type="checkbox"
<%= verbose ? "checked=\"true\"" : "" %> >
<br/>
highlight matches
<input name="highlight" type="checkbox"
<%= highlight ? "checked=\"true\"" : "" %> >
</td>
<td>
<textarea class="std" rows="3" cols="70" name="val"><%= val %></textarea>
</td>
</tr>
<tr>
<td>
<strong>Field value (Query)</strong>
<br/>
verbose output
<input name="qverbose" type="checkbox"
<%= qverbose ? "checked=\"true\"" : "" %> >
</td>
<td>
<textarea class="std" rows="1" cols="70" name="qval"><%= qval %></textarea>
</td>
</tr>
<tr>
<td>
</td>
<td>
<input class="stdbutton" type="submit" value="analyze">
</td>
</tr>
</table>
</form>
<%
SchemaField field = null;
SchemaField field=null;
if (name != "") {
if (name!="") {
try {
field = schema.getField(name);
} catch (Exception e) {
out.println("<error>Unknown Field " + name + "</error>");
out.println("<strong>Unknown Field " + name + "</strong>");
}
}
if (field != null) {
out.println(" <form>");
out.println(" <field>");
XML.escapeCharData(name, out);
out.println("</field>");
out.print(" <fieldIndexValue>");
XML.escapeCharData(val, out);
out.println(" </fieldIndexValue>");
out.print(" <fieldQueryValue>");
XML.escapeCharData(qval, out);
out.println(" </fieldQueryValue>");
out.println(" </form>");
if (field!=null) {
HashSet<Tok> matches = null;
if (qval != "" && highlight) {
if (qval!="" && highlight) {
Reader reader = new StringReader(qval);
Analyzer analyzer = field.getType().getQueryAnalyzer();
TokenStream tstream = analyzer.tokenStream(field.getName(), reader);
TokenStream tstream = analyzer.tokenStream(field.getName(),reader);
List<Token> tokens = getTokens(tstream);
matches = new HashSet<Tok>();
for (Token t : tokens) { matches.add( new Tok(t, 0)); }
for (Token t : tokens) { matches.add( new Tok(t,0)); }
}
out.println(" <results>");
if (val != "") {
out.println("<indexAnalyzer>");
doAnalyzer(out, field, val, false, verbose, matches);
out.println("</indexAnalyzer>");
if (val!="") {
out.println("<h3>Index Analyzer</h3>");
doAnalyzer(out, field, val, false, verbose,matches);
}
if (qval != "") {
out.println("<queryAnalyzer>");
doAnalyzer(out, field, qval, true, qverbose, null);
out.println("</queryAnalyzer>");
if (qval!="") {
out.println("<h3>Query Analyzer</h3>");
doAnalyzer(out, field, qval, true, qverbose,null);
}
out.println(" </results>");
}
%>
</analysis>
</solr>
</body>
</html>
<%!
private static void doAnalyzer(JspWriter out, SchemaField field, String val, boolean queryAnalyser, boolean verbose, Set<Tok> match) throws Exception {
Reader reader = new StringReader(val);
FieldType ft = field.getType();
Analyzer analyzer = queryAnalyser ? ft.getQueryAnalyzer() : ft.getAnalyzer();
Analyzer analyzer = queryAnalyser ?
ft.getQueryAnalyzer() : ft.getAnalyzer();
if (analyzer instanceof TokenizerChain) {
TokenizerChain tchain = (TokenizerChain)analyzer;
TokenizerFactory tfac = tchain.getTokenizerFactory();
@ -118,14 +161,12 @@
TokenStream tstream = tfac.create(reader);
List<Token> tokens = getTokens(tstream);
tstream = tfac.create(reader);
// write tokenizer factories
if (verbose) {
writeHeader(out, tfac.getClass(), tfac.getArgs());
}
writeTokens(out, tokens, ft, verbose, match);
// write filter factories
for (TokenFilterFactory filtfac : filtfacs) {
if (verbose) {
writeHeader(out, filtfac.getClass(), filtfac.getArgs());
@ -142,6 +183,7 @@
writeTokens(out, tokens, ft, verbose, match);
}
} else {
TokenStream tstream = analyzer.tokenStream(field.getName(),reader);
List<Token> tokens = getTokens(tstream);
@ -157,7 +199,7 @@
List<Token> tokens = new ArrayList<Token>();
while (true) {
Token t = tstream.next();
if (t == null) break;
if (t==null) break;
tokens.add(t);
}
return tokens;
@ -168,8 +210,8 @@
Token token;
int pos;
Tok(Token token, int pos) {
this.token = token;
this.pos = pos;
this.token=token;
this.pos=pos;
}
public boolean equals(Object o) {
@ -179,7 +221,7 @@
return token.termText().hashCode();
}
public String toString() {
return token.termText() + " at position " + pos;
return token.termText();
}
}
@ -187,38 +229,81 @@
public String toStr(Object o);
}
private static void printRow(JspWriter out, String header, List[] arrLst, ToStr converter, boolean multival, boolean verbose, Set<Tok> match) throws IOException {
// find the maximum number of terms for any position
int maxSz=1;
if (multival) {
for (List lst : arrLst) {
maxSz = Math.max(lst.size(), maxSz);
}
}
for (int idx=0; idx<maxSz; idx++) {
out.println("<tr>");
if (idx==0 && verbose) {
if (header != null) {
out.print("<th NOWRAP rowspan=\""+maxSz+"\">");
XML.escapeCharData(header,out);
out.println("</th>");
}
}
for (List<Tok> lst : arrLst) {
if (lst.size() <= idx) continue;
if (match!=null && match.contains(lst.get(idx))) {
out.print("<td class=\"highlight\"");
} else {
out.print("<td class=\"debugdata\"");
}
if (idx==0 && lst.size()==1 && maxSz > 1) {
out.print("rowspan=\""+maxSz+'"');
}
out.print('>');
XML.escapeCharData(converter.toStr(lst.get(idx)), out);
out.print("</td>");
}
out.println("</tr>");
}
}
static void writeHeader(JspWriter out, Class clazz, Map<String,String> args) throws IOException {
out.println(" <factory class=\"" + clazz.getName() + "\">");
out.println(" <args>");
for (Iterator<String> iter = args.keySet().iterator(); iter.hasNext(); ) {
String key = iter.next();
String value = args.get(key);
out.println(" <arg name=\"" + key + "\">" + value + "</arg>");
}
out.println(" </args>");
out.print("<h4>");
out.print(clazz.getName());
XML.escapeCharData(" "+args,out);
out.println("</h4>");
}
// readable, raw, pos, type, start/end
static void writeTokens(JspWriter out, List<Token> tokens, final FieldType ft, boolean verbose, Set<Tok> match) throws IOException {
// Use a map to tell what tokens are in what positions
// because some tokenizers/filters may do funky stuff with
// very large increments, or negative increments.
HashMap<Integer, List<Tok>> map = new HashMap<Integer, List<Tok>>();
boolean needRaw = false;
int pos = 0;
HashMap<Integer,List<Tok>> map = new HashMap<Integer,List<Tok>>();
boolean needRaw=false;
int pos=0;
for (Token t : tokens) {
if (!t.termText().equals(ft.indexedToReadable(t.termText()))) {
needRaw = true;
needRaw=true;
}
pos += t.getPositionIncrement();
List lst = map.get(pos);
if (lst == null) {
if (lst==null) {
lst = new ArrayList(1);
map.put(pos, lst);
map.put(pos,lst);
}
Tok tok = new Tok(t, pos);
Tok tok = new Tok(t,pos);
lst.add(tok);
}
@ -245,21 +330,70 @@
);
out.println(" <tokens>");
for (int i = 0; i < arr.length; i++) {
for (Tok tok : arr[i]) {
out.print(" <token");
out.print(" type=\"" + tok.token.type() + "\"");
out.print(" pos=\"" + tok.pos + "\"");
out.print(" start=\"" + tok.token.startOffset() + "\"");
out.print(" end=\"" + tok.token.endOffset() + "\"");
out.print(">");
out.print(tok.token.termText());
out.println(" </token>");
out.println("<table width=\"auto\" class=\"analysis\" border=\"1\">");
if (verbose) {
printRow(out,"term position", arr, new ToStr() {
public String toStr(Object o) {
return Integer.toString(((Tok)o).pos);
}
}
out.println(" </tokens>");
out.println(" </factory>");
,false
,verbose
,null);
}
printRow(out,"term text", arr, new ToStr() {
public String toStr(Object o) {
return ft.indexedToReadable( ((Tok)o).token.termText() );
}
}
,true
,verbose
,match
);
if (needRaw) {
printRow(out,"raw text", arr, new ToStr() {
public String toStr(Object o) {
// todo: output in hex or something?
// check if it's all ascii or not?
return ((Tok)o).token.termText();
}
}
,true
,verbose
,match
);
}
if (verbose) {
printRow(out,"term type", arr, new ToStr() {
public String toStr(Object o) {
return ((Tok)o).token.type();
}
}
,true
,verbose,
null
);
}
if (verbose) {
printRow(out,"source start,end", arr, new ToStr() {
public String toStr(Object o) {
Token t = ((Tok)o).token;
return Integer.toString(t.startOffset()) + ',' + t.endOffset() ;
}
}
,true
,verbose
,null
);
}
out.println("</table>");
}
%>