You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-user@lucene.apache.org by Tomas <to...@yahoo.com.ar> on 2010/02/05 20:54:49 UTC
Re: user feedback in solr
I'm responding to this old mail becouse I implemented something like this similar to http://wiki.apache.org/solr/SolrSnmp . Maybe we could discuss if this is a good solution.
I'm using Solr 1.4 on a JBoss 4.0.5 and Java 1.5.
In my particular case, what I'm trying to find out is how often the user uses wildcards on his query.
I implemented a Servlet Filter that extracts the "q" parameter from the request and log it (to a diferent log file, just for querys). After that, the filter pases the query to the MBean, wich parses que query looking for wildcrds and that's it.
This is not a complete solution but it might help.
What we are planning to do with this is to use de MBean to see "live" information, and to parse the "query.log" for a more detailed analysis of usage.
I put the following code on a jar file on the server's "lib" directory
---------QueryFilter--------------------------------------
public class QueryFilter implements Filter {
private static final Log log = LogFactory.getLog(QueryFilter.class);
private QueryStatsMBean mbean;
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if(request != null) {
String query = request.getParameter("q");
if(query != null) {
log.info("Query: " + query);
mbean.parseQuery(query);
}
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
log.info("init filter " + this);
mbean = new QueryStats();
try {
mbean.create();
registerMBean(mbean.getName(), mbean);
} catch (Exception e) {
throw new
ServletException(e);
}
}
private void registerMBean(String objectName, Object bean) throws ServletException {
MBeanServer mbs = MBeanServerLocator.locateJBoss();
try {
ObjectName on = new ObjectName(objectName);
mbs.registerMBean(bean, on);
log.info("MBean registered");
}
catch (NotCompliantMBeanException e) { throw new ServletException(e); }
catch (MBeanRegistrationException e) { throw new ServletException(e); }
catch (InstanceAlreadyExistsException e) { throw new ServletException(e); }
catch (MalformedObjectNameException e) { throw new ServletException(e); }
}
public void destroy() {
log.info("Destroying Filter" + this);
mbean.destroy();
}
}
---------------QueryStatsMBean------------------
public interface QueryStatsMBean extends org.jboss.system.ServiceMBean {
public Integer
getTotalQueries();
public Integer getAsteriskQueries();
public Integer getQuestionQueries();
public Integer getDefaultQueries();
public void parseQuery(String query);
public void create() throws Exception;
public void start() throws Exception;
public void stop();
public void destroy();
public int fileReaded();
}
------------QueryStats ----------------------------
public class QueryStats implements QueryStatsMBean{
private Integer totalQueries;
private Integer asteriskQueries;
private Integer questionQueries;
private Integer defaultQueries;
public void create() throws Exception {
totalQueries = new Integer(0);
asteriskQueries = new Integer(0);
questionQueries = new Integer(0);
defaultQueries = new Integer(0);
}
public void parseQuery(String query) {
totalQueries =
new Integer(totalQueries.intValue() + 1);
if(isDefaultQuery(query)) {
defaultQueries = new Integer(defaultQueries.intValue() + 1);
}else {
if(hasAsterisk(query)) {
asteriskQueries = new Integer(asteriskQueries.intValue() + 1);
}
if(hasQuestion(query)) {
questionQueries = new Integer(questionQueries.intValue() + 1);
}
}
}
private boolean hasQuestion(String query) {
return query.indexOf("?") != -1;
}
private boolean hasAsterisk(String query) {
return query.indexOf("*") != -1;
}
private boolean isDefaultQuery(String defaultQuery) {
return "*:*".equals(defaultQuery);
}
public Integer getTotalQueries() {
return totalQueries;
}
public
Integer getAsteriskQueries() {
return asteriskQueries;
}
public Integer getQuestionQueries() {
return questionQueries;
}
public Integer getDefaultQueries()
{
return defaultQueries;
}
public void destroy() {
/*
* I don't need any kind of persistence, but this could be a good place
* to do it
*/
}
public void start() throws Exception {
/*
* I don't need any kind of persistence, but this could be a good place
* to do it
*/
}
public void stop() {
/*
* I don't need any kind of persistence, but this could be a good place
* to do it
*/
}
public String getName() {
return "Solr:service=QueryStats";
}
public int getState() {
// TODO Auto-generated method stub
return 0;
}
public String getStateString() {
// TODO Auto-generated method stub
return
null;
}
public void jbossInternalLifecycle(String arg0) throws Exception {
}
public int fileReaded() {
return 0;
}
}
--------------------------------------
I also added the code
<filter>
<filter-name>MonitorQueryFilter</filter-name>
<filter-class>ar.com.osde.solr.QueryFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MonitorQueryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
to de web.xml of solr.war
Tomás
________________________________
Encontra las mejores recetas con Yahoo! Cocina.
http://ar.mujer.yahoo.com/cocina/
Yahoo! Cocina
Encontra las mejores recetas con Yahoo! Cocina.
http://ar.mujer.yahoo.com/cocina/