Plexian project page available here
Here is sample how to use plexian:
Write to applicationContext.xml next xml code:
<bean id="plexian" class="net.sf.plexian.springframework.PlexianBean">
<constructor-arg value="${webapp.root}/../../suggest" />
</bean>
Define Struts2 action in struts.xml like this:
<action name="autoCompleter" class="webapp.action.AutoCompleterAction">
<result>/WEB-INF/jsp/blocks/auto_completer.jspx</result>
</action>
Write java code for retrieve autocomplete information from storage:
public class AutoCompleterAction {
private Plexian plexian;
private String query;
private String field;
private boolean keywords = false;
private List<String> result;
public String execute() {
result = plexian.search(field, keywords ? SearchType.KEYWORDS : SearchType.ORIGINAL_NAMES, query);
return "success";
}
public void setQuery(String query) {
this.query = query;
}
public void setField(String field) {
this.field = field;
}
public void setPlexian(Plexian plexian) {
this.plexian = plexian;
}
public List<String> getResult() {
return result;
}
public void setKeywords(boolean keywords) {
this.keywords = keywords;
}
}
Define aculo.us scripts in html head required for autocomplete:
<script type="text/javascript" src="${request.contextPath}/jslib/aculous/effects.js">
<jsp:text />
</script>
<script type="text/javascript" src="${request.contextPath}/jslib/aculous/controls.js">
<jsp:text />
</script>
Insert div elements after input fields required for autocomplete:
<input type="text" name="query" AUTOCOMPLETE="OFF" id="search-query" />
<div class="auto_complete" id="query_auto_completer" style="display: none;"><jsp:text /></div>
Write onload javascript for initialize aculo.us:
function onLoad() {
new Ajax.Autocompleter('search-query', 'query_auto_completer', '/pub/autoCompleter', { paramName: 'query', parameters : 'keywords=true&field=PlexianFieldName' });
}
Write auto_completer.jspx:
<ul>
<c:if test="${not empty result}">
<c:forEach var="item" items="${result}">
<li>${item}</li>
</c:forEach>
</c:if>
</ul>
You can index and reindex plexian fields, using plexian bean:
plexian.index(FIELD_NAME, stringForIndex, IndexType.ADD_FREQ, freq);
You can use plexian indexator for Hibernate and Lucene datasource:
<bean id="plexianIndexators" class="net.sf.plexian.springframework.PlexianIndexatorsBean">
<property name="indexators">
<list>
<bean class="net.sf.plexian.indexator.lucene.LuceneIndexator">
<property name="plexian" ref="plexian" />
<property name="luceneIndexProvider" ref="luceneConfig" />
<property name="fields">
<map>
<entry key="FirstName" value="Profile.FIRST_NAME,Person.FIRST_NAME" />
</map>
</property>
</bean>
<bean class="net.sf.plexian.indexator.hibernate.HibernateIndexator">
<property name="plexian" ref="plexian" />
<property name="transactionManager" ref="transactionManager" />
<property name="hibernateOperations" ref="hibernateOperations" />
<property name="fields">
<map>
<entry key="LastName" value="Profile.lastName,Person.lastName" />
</map>
</property>
</bean>
</list>
</property>
</bean>
If you wants to get statistics by JMX then define:
<bean name="plexianMBean" class="net.sf.plexian.jmx.PlexianMBeanImpl">
<constructor-arg ref="plexian" />
</bean>
Then you can export this bean like this:
<bean id="MBeanExporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="exposeManagedResourceClassLoader" value="true" />
<property name="beans">
<map>
<entry key="Webapp:name=Plexian" value-ref="plexianMBean" />
</map>
</property>
<property name="autodetect" value="true" />
</bean>