RE: search - integrate compass (lucene) and appfuse

8 messages Options
Embed this post
Permalink
Matt Stine

RE: search - integrate compass (lucene) and appfuse

Reply Threaded More More options
Print post
Permalink
Just wanted to let you guys know that I'm working on a JSF version of
this tutorial.  Everything will be the same up until the point that
Spring MVC came into play.  I've basically pilfered the source of the
Spring controllers and turned them into backing beans.  It works out
quite nicely.

I'll post them up once they're working nicely.

- Matt
[hidden email]

> -----Original Message-----
> From: [hidden email] [mailto:[hidden email]] On Behalf Of Chris
Barham

> Sent: Monday, June 26, 2006 9:17 PM
> To: [hidden email]
> Subject: Re: [appfuse-user] search - integrate compass (lucene) and
> appfuse
>
> Hi Matt,
>
> Shay did a review over at the Compass forum and made some suggestions.
>  I will rework and incorporate them.  Also, as I will have to do this
> anyway, I will try to rework the Spring Controller to give a
> DisplayTag-able List and return the search hit highlight terms.
>
> Once done I'll repost.
>
> Shay's comments are at http://tinyurl.com/f9qm9  (which is
> http://forums.opensymphony.com/thread.jspa?threadID=35452&tstart=0 for
> those allergic to snipurl/tinurl :-) )
>
> Regards,
> Chris
>
>
>
> On 6/24/06, Matt Raible <[hidden email]> wrote:
> > Great work Chris!  Thanks for the detailed instructions.  Hopefully
> > someone else can "tech review" them and we can get them on the wiki,
> > or possibly published in an article on java.net.  If anyone is
> > interested in writing an article for java.net (or another site), let
> > me know.  I can probably hook you up.
> >
> > Matt
> >
> > On 6/23/06, Chris Barham <[hidden email]> wrote:
> > > Hi,
> > >
> > > I've been playing with Compass and Appfuse to give search
capability.
> > > I made notes as I was going and post them here in case anyone else
> > > finds them useful.  A big thanks to Matt and Shay for these two
> > > projects, they work so well together :-)
> > >
> > > This is a barebones setup, my next job, (I think), is to rework
the
> > > SpringController to give back a list with highlight terms on the
> > > search results so that Displaytag can render it, (If anyone has
done

> > > this please let me know if this is the best approach).
> > >
> > > Once running you can browse the index using Luke
> http://www.getopt.org/luke/
> > >
> > > Steps as follows:
> > >
> > > Integrate Compass search with Appfuse
> > > -----------------------------------------------------
> > >
> > > 1.      Get a new latest Appfuse project setup a la
> > > http://raibledesigns.com/wiki/AppFuseQuickStart.html  For this I
used
> > > a project called weblogs, using Spring MVC and hibernate (Apache
Derby
> > > as the RDBMS)
> > > 2.      Get Spring 2.0 (currently Rc1)
> http://www.springframework.org/download
> > > 3.      Get Compass (currently 0.9.2SNAPSHOT)
> http://www.opensymphony.com/compass/
> > > 4.      Install these...
> > > a.      Make directories under lib directory place jars as
follows:

> > >
> > > compass-0.9.2-SNAPSHOT
> > > |-- commons-logging.jar
> > > |-- compass.jar
> > > |-- lucene-analyzers.jar
> > > |-- lucene-core.jar
> > > |-- lucene-highlighter.jar
> > > `-- lucene-snowball.jar
> > >
> > > and
> > >
> > > spring-2.0RC1/
> > > |-- acegi-security-1.0.0-RC2.jar
> > > |-- commons-codec-1.3.jar
> > > |-- ehcache-1.2.jar
> > > |-- spring-aspects.jar
> > > |-- spring-mock.jar
> > > |-- spring.jar
> > > |-- springmodules-validator-dev-20051217.jar
> > > `-- validator-rules.xml
> > >
> > >
> > > b.      Change lib.properties:
> > >
> > > #
> > > # Spring Framework - http://www.springframework.org
> > > #
> > > spring.version=2.0RC1
> > > spring.dir=${lib.dir}/spring-${spring.version}
> > > spring.jar=${spring.dir}/spring.jar
> > >
> > > #
> > > # Compass search http://www.opensymphony.com/compass/
> > > #
> > > compass.version=0.9.2-SNAPSHOT
> > > compass.dir=${lib.dir}/compass-${compass.version}
> > >
> > > 5.      Add compass to the service.compile.classpath and
> > > web.compile.classpath in properties.xml:
> > >         <fileset dir="${compass.dir}" includes="*.jar" />
> > > 6.      Add the compass jars to the war task in build.xml (so they
get
> > > copied into the war)
> > >          <lib dir="${compass.dir}" includes="*.jar"/>
> > > 7.      Add the metadata files to src/dao/../model/
> > > Weblogs.cmd.xml - common metadata (optional) - this doesn't get
used

> > > in this example
> > > E.g.:
> > > <?xml version="1.0"?>
> > > <!DOCTYPE compass-core-meta-data PUBLIC
> > >     "-//Compass/Compass Core Meta Data DTD 1.0//EN"
> > >     "http://www.opensymphony.com/compass/dtd/compass-core-meta-
> data.dtd">
> > >
> > > <compass-core-meta-data>
> > >         <meta-data-group id="weblogs" displayName="Weblogs Meta
Data">
> > >                 <description>mongoose Meta Data</description>
> > >                  <uri>http://compass/weblogs</uri>
> > >                 <meta-data id="createddate"
displayName="createddate">
> > >                         <description>CreatedDate</description>
> > >
<uri>http://compass/weblogs/createddate</uri>
> > >                         <name
format="dd/MM/yyyy">createddate</name>

> > >                 </meta-data>
> > >         </meta-data-group>
> > > </compass-core-meta-data>
> > >
> > >
> > > Mapping metadata: weblogs.cpm.xml
> > >
> > > <?xml version="1.0"?>
> > > <!DOCTYPE compass-core-mapping PUBLIC
> > >     "-//Compass/Compass Core Mapping DTD 1.0//EN"
> > >     "http://www.opensymphony.com/compass/dtd/compass-core-
> mapping.dtd">
> > >
> > > <compass-core-mapping package="com.pobox.cbarham.model">
> > >         <!-- ============================================= -->
> > >         <!--  USER           -->
> > >         <!-- ============================================= -->
> > >         <class name="User" alias="user" root="true">
> > >                 <id name="id" />
> > >                 <constant>
> > >                         <meta-data>type</meta-data>
> > >                         <meta-data-value>user</meta-data-value>
> > >                 </constant>
> > >                 <property name="lastName">
> > >                         <meta-data boost="2">lastName</meta-data>
> > >                 </property>
> > >                 <property name="firstName">
> > >                         <meta-data>firstName</meta-data>
> > >                 </property>
> > >                 <property name="enabled">
> > >                         <meta-data>enabled</meta-data>
> > >                 </property>
> > >                 <property name="phoneNumber">
> > >                         <meta-data>phoneNumber</meta-data>
> > >                 </property>
> > >                 <property name="email">
> > >                         <meta-data>email</meta-data>
> > >                 </property>
> > >                 <property name="address">
> > >                         <meta-data>address</meta-data>
> > >                 </property>
> > >                 <property name="email">
> > >                         <meta-data>email</meta-data>
> > >                 </property>
> > >                 <property name="accountExpired">
> > >                         <meta-data>accountExpired</meta-data>
> > >                 </property>
> > >                 <property name="accountLocked">
> > >                         <meta-data>accountLocked</meta-data>
> > >                 </property>
> > >                 <property name="username">
> > >                         <meta-data>username</meta-data>
> > >                 </property>
> > >                 <property name="website">
> > >                         <meta-data>website</meta-data>
> > >                 </property>
> > >
> > >                 <component name="roles" ref-alias="role" />
> > >                 <component name="address" ref-alias="address" />
> > >         </class>
> > >         <!-- ============================================= -->
> > >         <!--  ROLE            -->
> > >         <!-- ============================================= -->
> > >         <class name="Role" alias="role" root="false">
> > >                 <id name="id" />
> > >                 <constant>
> > >                         <meta-data>type</meta-data>
> > >                         <meta-data-value>role</meta-data-value>
> > >                 </constant>
> > >                 <property name="description">
> > >                         <meta-data>description</meta-data>
> > >                 </property>
> > >                 <property name="name">
> > >                         <meta-data>name</meta-data>
> > >                 </property>
> > >         </class>
> > >         <!-- ============================================= -->
> > >         <!--  ADDRESS            -->
> > >         <!-- ============================================= -->
> > >         <class name="Address" alias="address" root="false">
> > >                 <constant>
> > >                         <meta-data>type</meta-data>
> > >                         <meta-data-value>address</meta-data-value>
> > >                 </constant>
> > >                 <property name="address">
> > >                         <meta-data>address</meta-data>
> > >                 </property>
> > >                 <property name="city">
> > >                         <meta-data>address</meta-data>
> > >                 </property>
> > >                 <property name="country">
> > >                         <meta-data>address</meta-data>
> > >                 </property>
> > >                 <property name="postalCode">
> > >                         <meta-data>address</meta-data>
> > >                 </property>
> > >                 <property name="province">
> > >                         <meta-data>address</meta-data>
> > >                 </property>
> > >         </class>
> > >
> > > </compass-core-mapping>
> > >
> > > 8.      Edit
src/service/.../service/applicationContext-service.xml

> > >  And add the compass spring beans: (change the resource locations
> > > accordingly) - also note that this puts the index on the root
> > > filesystem in a directory called compass
> > >
> > >         <!-- COMPASS START -->
> > >         <bean id="compass"
> class="org.compass.spring.LocalCompassBean">
> > >                 <property name="resourceLocations">
> > >                         <list>
> > >                                 <value>classpath:{PATH-TO-MODEL}
> /model/weblogs.cmd.xml</value>
> > >                                 <value>classpath: :{PATH-TO-MODEL
> /model/weblogs.cpm.xml</value>
> > >                         </list>
> > >                 </property>
> > >                 <property name="compassSettings">
> > >                         <props>
> > >                                 <prop
> key="compass.engine.connection">file:///compass/weblogs</prop>
> > >                                 <prop
>
key="compass.transaction.factory">org.compass.spring.transaction.SpringS
yn
> cTransactionFactory</prop>
> > >                         </props>
> > >                 </property>
> > >                 <property name="transactionManager"
> ref="transactionManager" />
> > >         </bean>
> > >         <bean id="hibernateGpsDevice"
> > >
class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">
> > >                 <property name="name">
> > >                         <value>hibernateDevice</value>
> > >                 </property>
> > >                 <property name="sessionFactory"
ref="sessionFactory"

> />
> > >
> > >         </bean>
> > >         <bean id="compassGps"
> class="org.compass.gps.impl.SingleCompassGps"
> > > init-method="start" destroy-method="stop">
> > >                 <property name="compass">
> > >                         <ref bean="compass" />
> > >                 </property>
> > >                 <property name="gpsDevices">
> > >                         <list>
> > >                                 <bean
>
class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">

> > >                                         <property name="gpsDevice"
> ref="hibernateGpsDevice" />
> > >                                 </bean>
> > >                         </list>
> > >                 </property>
> > >         </bean>
> > >         <!-- COMPASS END -->
> > >
> > > 9.      Add in the JSP's to drive the index and search....
> > > a.       Under web/pages add a reindex.jsp:
> > > <%@ include file="/common/taglibs.jsp"%>
> > > <P>
> > > <H2>Compass Index</H2>
> > > <P>
> > > Use the Index button to index the database using Compass::Gps. The
> > > operation will
> > > delete the current index and reindex the database based on the
> > > mappings and devices
> > > defined in the Compass::Gps configuration context.
> > > <FORM method="POST" action="<c:url value="/reindex.html"/>">
> > >         <spring:bind path="command.doIndex">
> > >                 <INPUT type="hidden" name="doIndex" value="true"
/>

> > >         </spring:bind>
> > >     <INPUT type="submit" value="Index"/>
> > > </FORM>
> > > <c:if test="${! empty indexResults}">
> > >         <P>Indexing took: <c:out value="${indexResults.indexTime}"
> />ms.
> > > </c:if>
> > > <P>
> > >
> > > b.      under web/pages add search.jsp:
> > > <%@ include file="/common/taglibs.jsp"%>
> > > <title>Search</title>
> > > <content tag="heading">
> > > Search:
> > > </content>
> > > <FORM method="GET">
> > >         <spring:bind path="command.query">
> > >                 <INPUT type="text" size="20" name="query"
> value="<c:out
> > > value="${status.value}"/> " />
> > >         </spring:bind>
> > >
> > >         <P />
> > >                 <INPUT type="submit" value="Search" />
> > > </FORM>
> > > <p />
> > >         <c:if test="${! empty searchResults}">
> > >                 <P />
> > >                         Search took
> > >                         <c:out value="${searchResults.searchTime}"
/>

> > >                         ms
> > >                 <P />
> > >                 <TABLE border="2">
> > >                         <TR>
> > >                                 <TH>
> > >                                         SCORE
> > >                                 </TH>
> > >                                 <TH>
> > >                                         TYPE
> > >                                 </TH>
> > >                                 <TH>
> > >                                         ID
> > >                                 </TH>
> > >                         </TR>
> > >
> > >                         <c:forEach var="hit"
> items="${searchResults.hits}">
> > >                                 <P />
> > >                                 <TR>
> > >                                         <TD>
> > >                                                 <fmt:formatNumber
> type="percent" value="${hit.score}" />
> > >                                         </TD>
> > >                                         <TD>
> > >                                                 <c:out
> value="${hit.alias}" />
> > >
> > >                                         </TD>
> > >                                         <TD>
> > >                                                 <c:out
> value="${hit.data.id}" />
> > >                                         </TD>
> > >                                 </TR>
> > >                         </c:forEach>
> > >                 </TABLE>
> > >
> > >         </c:if>
> > >
> > > c.      Wire up the controllers - edit
web/WEB-INF/action-servlet.xml

> and
> > > add these beans:
> > >
> > >         <bean id="searchController"
> > > class="org.compass.spring.web.mvc.CompassSearchController">
> > >                 <property name="compass"><ref
> bean="compass"/></property>
> > >                 <property
> name="searchView"><value>searchView</value></property>
> > >                 <property
> name="searchResultsView"><value>searchResultsView</value></property>
> > >                 <property
name="pageSize"><value>10</value></property>

> > >         </bean>
> > >         <!-- ====  COMPASS SEARCH CONTROLLER ==== -->
> > >
> > >         <bean id="indexController"
> > > class="org.compass.spring.web.mvc.CompassIndexController">
> > >                 <property name="compassGps"><ref
> bean="compassGps"/></property>
> > >                 <property
> name="indexView"><value>reindexView</value></property>
> > >                 <property
> name="indexResultsView"><value>reindexResultsView</value></property>
> > >         </bean>
> > >
> > >     <!-- View Resolver for JSPs -->
> > >         <bean id="rbViewResolver"
> > >
>
class="org.springframework.web.servlet.view.ResourceBundleViewResolver">

> > >                 <property
> name="basename"><value>views</value></property>
> > >                 <property name="order"><value>0</value></property>
> > >         </bean>
> > > d.      Also add them into the urlMapping:
> > >         <prop key="/search.html">searchController</prop>
> > > <prop key="/reindex.html">indexController</prop>
> > >
> > > e.      Add a file views.properties under web/WEB-INF/classes
> containing:
> > > searchView.class=org.springframework.web.servlet.view.JstlView
> > > searchView.url=/WEB-INF/pages/search.jsp
> > >
> > >
searchResultsView.class=org.springframework.web.servlet.view.JstlView
> > > searchResultsView.url=/WEB-INF/pages/search.jsp
> > >
> > > reindexView.class=org.springframework.web.servlet.view.JstlView
> > > reindexView.url=/WEB-INF/pages/reindex.jsp
> > >
> > >
reindexResultsView.class=org.springframework.web.servlet.view.JstlView
> > > reindexResultsView.url=/WEB-INF/pages/reindex.jsp
> > >
> > > f.      Add in menu - edit menu-config in web/WEB-INF add the
reindex

> to
> > > the admin menu:
> > > <Item name="ReIndex" title="menu.reindex" page="/reindex.html"
> roles="admin" />
> > > g.      add search to it's own menu:
> > >         <Menu name="SearchMenu" title="menu.search"
> page="/search.html" wifth="60" />
> > > h.      now edit /web/pages/menu/jsp to add the new search menu:
> > > <menu:displayMenu name="FileUpload"/>
> > > <menu:displayMenu name="SearchMenu"/> <!--  ADDED LiNE -->
> > >  <menu:displayMenu name="AdminMenu"/>
> > > i.      add the menu properties in
> > > WEB-INF/classes/ApplicationResources.properties :
> > > menu.search=Search
> > > menu.reindex=Re-Index
> > >
> > >
> > > Cheers
> > > Chris
> > >
> > > --
> > > -------------------------------------------------
> > > Christopher Barham
> > > [hidden email]
> > >
> > >
---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [hidden email]
> > > For additional commands, e-mail: [hidden email]
> > >
> > >
> >
> >
---------------------------------------------------------------------

> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
> >
> >
> >
>
>
> --
> -------------------------------------------------
> Christopher Barham
> [hidden email]
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Matt Stine

RE: search - integrate compass (lucene) and appfuse

Reply Threaded More More options
Print post
Permalink
No problem.  Here's the modifications for JSF:

I extracted this from an application that I'm actually building - I
tried to remove all of the stuff specific to us, but something may have
slipped through.  Please give it a try w/ the original tutorial if you
are using JSF.  I'd be glad to help add this to the full tutorial
whenever it goes wiki/article.

First off, dump step 9 from the original tutorial.  We're going to need
JSF equivalents of the Compass-bundled Spring MVC controllers.  Here we
go, with a new step 9.

9. Create two backing beans, one for Index and one for Search.
These are based on the Spring MVC controllers:

/*
 * This code is a derivative of
org.compass.spring.web.mvc.CompassSearchController
 * as dispayed at:
http://svn.opensymphony.com/fisheye/browse/~raw,r=33/compass/trunk/src/m
ain/src/org/compass/spring/web/mvc/CompassIndexController.java
 * and as such requires the addition of this license.
 *
 * Copyright 2004-2006 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package <<YOUR PACKAGE>>.webapp.action;

import org.compass.gps.CompassGps;

/**
 * A JSF backing bean to perform Compass indexing following the same
 * general contract (removing Spring MVC specific code) as
<code>CompassIndexController</code>
 *
 * @author Matt Stine (original author kimchy)
 * @see org.compass.spring.web.mvc.CompassIndexController
 */
public class CompassIndex extends BasePage {

    private CompassGps compassGps;
    private long indexTime;

    public void setCompassGps(CompassGps compassGps) {
        this.compassGps = compassGps;
    }

    public CompassGps getCompassGps() {
        return compassGps;
    }

    public long getIndexTime() {
        return indexTime;
    }

    public void setIndexTime(long indexTime) {
        this.indexTime = indexTime;
    }

    public String doIndex() {
        long time = System.currentTimeMillis();
        getCompassGps().index();
        setIndexTime(System.currentTimeMillis() - time);

        return "indexComplete";
    }
}

/*
 * This code is a derivative of
org.compass.spring.web.mvc.CompassSearchController
 * as dispayed at:
http://svn.opensymphony.com/fisheye/browse/~raw,r=658/compass/trunk/src/
main/src/org/compass/spring/web/mvc/CompassSearchController.java
 * and as such requires the addition of this license.
 *
 * Copyright 2004-2006 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package <<YOUR PACKAGE>>.webapp.action;

import org.compass.core.*;
import org.compass.spring.web.mvc.CompassSearchCommand;
import org.compass.spring.web.mvc.CompassSearchResults;
import org.springframework.util.StringUtils;

/**
 * A JSF backing bean to perform Compass searches following the same
 * general contract (removing most of the Spring MVC specific code) as
<code>CompassSearchController</code>
 *
 * @author Matt Stine (original author kimchy)
 * @see org.compass.spring.web.mvc.CompassSearchController
 */
public class CompassSearch extends BasePage {

    private Compass compass;
    private CompassTemplate compassTemplate;
    private Integer pageSize;
    private CompassSearchResults searchResults;
    private Integer page = new Integer(0);
    private String query;

    public Compass getCompass() {
        return compass;
    }

    public void setCompass(Compass compass) {
        this.compass = compass;
        this.compassTemplate = new CompassTemplate(compass);
    }

    public CompassTemplate getCompassTemplate() {
        return compassTemplate;
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public CompassSearchResults getSearchResults() {
        return searchResults;
    }

    public void setSearchResults(CompassSearchResults searchResults) {
        this.searchResults = searchResults;
    }

    public String doSearch() {
        final CompassSearchCommand searchCommand = new
CompassSearchCommand();
        searchCommand.setPage(getPage());
        searchCommand.setQuery(getQuery());
        if (!StringUtils.hasText(searchCommand.getQuery())) {
            return "search";
        }
        searchResults = (CompassSearchResults)
getCompassTemplate().execute(
 
CompassTransaction.TransactionIsolation.READ_ONLY_READ_COMMITTED, new
CompassCallback() {
            public Object doInCompass(CompassSession session) throws
CompassException {
                return performSearch(searchCommand, session);
            }
        });
        return "searchResults";
    }

    protected CompassSearchResults performSearch(CompassSearchCommand
searchCommand, CompassSession session) {
        long time = System.currentTimeMillis();
        CompassQuery query = buildQuery(searchCommand, session);
        CompassHits hits = query.hits();
        CompassDetachedHits detachedHits;
        CompassSearchResults.Page[] pages = null;
        if (pageSize == null) {
            doProcessBeforeDetach(searchCommand, session, hits, -1, -1);
            detachedHits = hits.detach();
        } else {
            int iPageSize = pageSize.intValue();
            int page = 0;
            int hitsLength = hits.getLength();
            if (searchCommand.getPage() != null) {
                page = searchCommand.getPage().intValue();
            }
            int from = page * iPageSize;
            if (from > hits.getLength()) {
                from = hits.getLength() - iPageSize;
                doProcessBeforeDetach(searchCommand, session, hits,
from, hitsLength);
                detachedHits = hits.detach(from, hitsLength);
            } else if ((from + iPageSize) > hitsLength) {
                doProcessBeforeDetach(searchCommand, session, hits,
from, hitsLength);
                detachedHits = hits.detach(from, hitsLength);
            } else {
                doProcessBeforeDetach(searchCommand, session, hits,
from, iPageSize);
                detachedHits = hits.detach(from, iPageSize);
            }
            doProcessAfterDetach(searchCommand, session, detachedHits);
            int numberOfPages = (int) Math.ceil((float) hitsLength /
iPageSize);
            pages = new CompassSearchResults.Page[numberOfPages];
            for (int i = 0; i < pages.length; i++) {
                pages[i] = new CompassSearchResults.Page();
                pages[i].setFrom(i * iPageSize + 1);
                pages[i].setSize(iPageSize);
                pages[i].setTo((i + 1) * iPageSize);
                if (from >= (pages[i].getFrom() - 1) && from <
pages[i].getTo()) {
                    pages[i].setSelected(true);
                } else {
                    pages[i].setSelected(false);
                }
            }
            if (numberOfPages > 0) {
                CompassSearchResults.Page lastPage = pages[numberOfPages
- 1];
                if (lastPage.getTo() > hitsLength) {
                    lastPage.setSize(hitsLength - lastPage.getFrom());
                    lastPage.setTo(hitsLength);
                }
            }
        }
        time = System.currentTimeMillis() - time;
        CompassSearchResults searchResults = new
CompassSearchResults(detachedHits.getHits(), time);
        searchResults.setPages(pages);
        return searchResults;
    }

    /**
     * Acts as an extension point for search controller that wish to
build
     * different CompassQueries. <p/> The default implementation uses
the
     * session to create a query builder and use the queryString option,
i.e.:
     *
<code>session.queryBuilder().queryString(searchCommand.getQuery().trim()
).toQuery();</code>.
     * <p/> Some other interesting options might be to add sorting to
the query,
     * adding other queries using a boolean query, or executing a
different
     * query.
     */
    protected CompassQuery buildQuery(CompassSearchCommand
searchCommand, CompassSession session) {
        return
session.queryBuilder().queryString(searchCommand.getQuery().trim()).toQu
ery();
    }

    /**
     * An option to perform any type of processing before the hits are
detached.
     */
    protected void doProcessBeforeDetach(CompassSearchCommand
searchCommand, CompassSession session, CompassHits hits,
                                         int from, int size) {

    }

    /**
     * An option to perform any type of processing before the hits are
detached.
     */
    protected void doProcessAfterDetach(CompassSearchCommand
searchCommand, CompassSession session,
                                        CompassDetachedHits hits) {

    }

    /**
     * Sets the page size for the pagination of the results. If not set,
not
     * pagination will be used.
     */
    public Integer getPageSize() {
        return pageSize;
    }

    /**
     * Returns the page size for the pagination of the results. If not
set, not
     * pagination will be used.
     *
     * @param pageSize
     */
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
}

10. Wire them up in faces-config.xml:

<managed-bean>
        <managed-bean-name>compassIndex</managed-bean-name>
        <managed-bean-class><<YOUR
PACKAGE>>.webapp.action.CompassIndex</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>

        <managed-property>
            <property-name>compassGps</property-name>
            <value>#{compassGps}</value>
        </managed-property>
    </managed-bean>

    <managed-bean>
        <managed-bean-name>compassSearch</managed-bean-name>
        <managed-bean-class><<YOUR
PACKAGE>>.webapp.action.CompassSearch</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>

        <managed-property>
            <property-name>compass</property-name>
            <value>#{compass}</value>
        </managed-property>

        <managed-property>
            <property-name>pageSize</property-name>
            <value>10</value>
        </managed-property>
    </managed-bean>

11. Create JSP's in web:

        a. reindex.jsp

<%@ include file="/common/taglibs.jsp"%>
<title>Compass Index</title>

<content tag="heading">Compass Index</content>
<f:view>
    <body>
    <f:verbatim>
       Use the Index button to index the database using Compass::Gps.
The operation will delete
       the current index and reindex the database based on the mappings
and devices defined in the
       Compass::Gps configuration context.
    </f:verbatim>
    <h:form id="compassIndexForm">
        <h:commandButton action="#{compassIndex.doIndex}"
value="Index"/>
    </h:form>
    <c:if test="${compassIndex.indexTime != 0}">
        <f:verbatim><P>Indexing took:</f:verbatim><c:out
value="${compassIndex.indexTime}" /><f:verbatim>ms.</f:verbatim>
    </c:if>
    </body>
</f:view>

        b. search.jsp

<%@ include file="/common/taglibs.jsp" %>
<title>Compass Search</title>

<content tag="heading">Compass Search</content>
<f:view>
    <body>
    <h:form id="compassSearchForm">
        <h:inputText id="query" size="20"
value="#{compassSearch.query}"/>
        <h:commandButton action="#{compassSearch.doSearch}"
value="Search"/>
    </h:form>
    <p/>
    <c:if test="${! empty compassSearch.searchResults}">
        <P/>
        Search took
        <c:out value="${compassSearch.searchResults.searchTime}"/>
        ms
        <P/>
        <h:dataTable var="hit"
value="#{compassSearch.searchResults.hits}" style="display:none"/>

        <display:table name="compassSearch.searchResults.hits"
cellspacing="0" cellpadding="0" requestURI=""
                       id="hit" pagesize="25" class="list"
export="true">

            <display:column title="Score">
                 <fmt:formatNumber type="percent" value="${hit.score}"/>
            </display:column>
            <display:column title="Type">
                <c:out value="${hit.alias}"/>
            </display:column>
            <display:column title="ID">
                        <c:out value="${hit.data.id}"/>
                </display:column>


            <display:setProperty name="paging.banner.item_name"
value="Item"/>
            <display:setProperty name="paging.banner.items_name"
value="Items"/>
        </display:table>
    </c:if>
    </body>
</f:view>

12. Add navigation rules in faces-config.xml:

<navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>indexComplete</from-outcome>
            <to-view-id>/reindex.jsp</to-view-id>
            <redirect/>
        </navigation-case>
    </navigation-rule>
    <navigation-rule>
        <from-view-id>/search.jsp</from-view-id>
        <navigation-case>
            <from-outcome>searchResults</from-outcome>
            <to-view-id>/search.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

13. Add everything to the menu:

a. Add in menu - edit menu-config in web/WEB-INF add the reindex to
the admin menu:
<Item name="ReIndex" title="menu.reindex" page="/reindex.html"
roles="admin" />
b. add search to it's own menu:
        <Menu name="SearchMenu" title="menu.search" page="/search.html"
wifth="60" />
c. now edit /web/menu.jsp to add the new search menu:
<menu:displayMenu name="FileUpload"/>
<menu:displayMenu name="SearchMenu"/> <!--  ADDED LiNE -->
 <menu:displayMenu name="AdminMenu"/>
d. add the menu properties in
WEB-INF/classes/ApplicationResources.properties :
menu.search=Search
menu.reindex=Re-Index

Enjoy!

- Matt
[hidden email]

> -----Original Message-----
> From: Matt Raible [mailto:[hidden email]]
> Sent: Friday, July 07, 2006 9:50 AM
> To: [hidden email]
> Subject: Re: [appfuse-user] search - integrate compass (lucene) and
> appfuse
>
> Thanks Matt!  You guys are going to have the 2.1 features done before
> we even get started on 2.0. ;-)
>
> Matt
>
> On 7/7/06, Stine, Matt <[hidden email]> wrote:
> > Just wanted to let you guys know that I'm working on a JSF version
of
> > this tutorial.  Everything will be the same up until the point that
> > Spring MVC came into play.  I've basically pilfered the source of
the

> > Spring controllers and turned them into backing beans.  It works out
> > quite nicely.
> >
> > I'll post them up once they're working nicely.
> >
> > - Matt
> > [hidden email]
> >
> > > -----Original Message-----
> > > From: [hidden email] [mailto:[hidden email]] On Behalf Of
Chris
> > Barham
> > > Sent: Monday, June 26, 2006 9:17 PM
> > > To: [hidden email]
> > > Subject: Re: [appfuse-user] search - integrate compass (lucene)
and
> > > appfuse
> > >
> > > Hi Matt,
> > >
> > > Shay did a review over at the Compass forum and made some
suggestions.
> > >  I will rework and incorporate them.  Also, as I will have to do
this
> > > anyway, I will try to rework the Spring Controller to give a
> > > DisplayTag-able List and return the search hit highlight terms.
> > >
> > > Once done I'll repost.
> > >
> > > Shay's comments are at http://tinyurl.com/f9qm9  (which is
> > > http://forums.opensymphony.com/thread.jspa?threadID=35452&tstart=0
for
> > > those allergic to snipurl/tinurl :-) )
> > >
> > > Regards,
> > > Chris
> > >
> > >
> > >
> > > On 6/24/06, Matt Raible <[hidden email]> wrote:
> > > > Great work Chris!  Thanks for the detailed instructions.
Hopefully
> > > > someone else can "tech review" them and we can get them on the
wiki,
> > > > or possibly published in an article on java.net.  If anyone is
> > > > interested in writing an article for java.net (or another site),
let

> > > > me know.  I can probably hook you up.
> > > >
> > > > Matt
> > > >
> > > > On 6/23/06, Chris Barham <[hidden email]> wrote:
> > > > > Hi,
> > > > >
> > > > > I've been playing with Compass and Appfuse to give search
> > capability.
> > > > > I made notes as I was going and post them here in case anyone
else
> > > > > finds them useful.  A big thanks to Matt and Shay for these
two
> > > > > projects, they work so well together :-)
> > > > >
> > > > > This is a barebones setup, my next job, (I think), is to
rework
> > the
> > > > > SpringController to give back a list with highlight terms on
the
> > > > > search results so that Displaytag can render it, (If anyone
has

> > done
> > > > > this please let me know if this is the best approach).
> > > > >
> > > > > Once running you can browse the index using Luke
> > > http://www.getopt.org/luke/
> > > > >
> > > > > Steps as follows:
> > > > >
> > > > > Integrate Compass search with Appfuse
> > > > > -----------------------------------------------------
> > > > >
> > > > > 1.      Get a new latest Appfuse project setup a la
> > > > > http://raibledesigns.com/wiki/AppFuseQuickStart.html  For this
I
> > used
> > > > > a project called weblogs, using Spring MVC and hibernate
(Apache

> > Derby
> > > > > as the RDBMS)
> > > > > 2.      Get Spring 2.0 (currently Rc1)
> > > http://www.springframework.org/download
> > > > > 3.      Get Compass (currently 0.9.2SNAPSHOT)
> > > http://www.opensymphony.com/compass/
> > > > > 4.      Install these...
> > > > > a.      Make directories under lib directory place jars as
> > follows:
> > > > >
> > > > > compass-0.9.2-SNAPSHOT
> > > > > |-- commons-logging.jar
> > > > > |-- compass.jar
> > > > > |-- lucene-analyzers.jar
> > > > > |-- lucene-core.jar
> > > > > |-- lucene-highlighter.jar
> > > > > `-- lucene-snowball.jar
> > > > >
> > > > > and
> > > > >
> > > > > spring-2.0RC1/
> > > > > |-- acegi-security-1.0.0-RC2.jar
> > > > > |-- commons-codec-1.3.jar
> > > > > |-- ehcache-1.2.jar
> > > > > |-- spring-aspects.jar
> > > > > |-- spring-mock.jar
> > > > > |-- spring.jar
> > > > > |-- springmodules-validator-dev-20051217.jar
> > > > > `-- validator-rules.xml
> > > > >
> > > > >
> > > > > b.      Change lib.properties:
> > > > >
> > > > > #
> > > > > # Spring Framework - http://www.springframework.org
> > > > > #
> > > > > spring.version=2.0RC1
> > > > > spring.dir=${lib.dir}/spring-${spring.version}
> > > > > spring.jar=${spring.dir}/spring.jar
> > > > >
> > > > > #
> > > > > # Compass search http://www.opensymphony.com/compass/
> > > > > #
> > > > > compass.version=0.9.2-SNAPSHOT
> > > > > compass.dir=${lib.dir}/compass-${compass.version}
> > > > >
> > > > > 5.      Add compass to the service.compile.classpath and
> > > > > web.compile.classpath in properties.xml:
> > > > >         <fileset dir="${compass.dir}" includes="*.jar" />
> > > > > 6.      Add the compass jars to the war task in build.xml (so
they
> > get
> > > > > copied into the war)
> > > > >          <lib dir="${compass.dir}" includes="*.jar"/>
> > > > > 7.      Add the metadata files to src/dao/../model/
> > > > > Weblogs.cmd.xml - common metadata (optional) - this doesn't
get
> > used
> > > > > in this example
> > > > > E.g.:
> > > > > <?xml version="1.0"?>
> > > > > <!DOCTYPE compass-core-meta-data PUBLIC
> > > > >     "-//Compass/Compass Core Meta Data DTD 1.0//EN"
> > > > >
"http://www.opensymphony.com/compass/dtd/compass-core-meta-
> > > data.dtd">
> > > > >
> > > > > <compass-core-meta-data>
> > > > >         <meta-data-group id="weblogs" displayName="Weblogs
Meta

> > Data">
> > > > >                 <description>mongoose Meta Data</description>
> > > > >                  <uri>http://compass/weblogs</uri>
> > > > >                 <meta-data id="createddate"
> > displayName="createddate">
> > > > >                         <description>CreatedDate</description>
> > > > >
> > <uri>http://compass/weblogs/createddate</uri>
> > > > >                         <name
> > format="dd/MM/yyyy">createddate</name>
> > > > >                 </meta-data>
> > > > >         </meta-data-group>
> > > > > </compass-core-meta-data>
> > > > >
> > > > >
> > > > > Mapping metadata: weblogs.cpm.xml
> > > > >
> > > > > <?xml version="1.0"?>
> > > > > <!DOCTYPE compass-core-mapping PUBLIC
> > > > >     "-//Compass/Compass Core Mapping DTD 1.0//EN"
> > > > >     "http://www.opensymphony.com/compass/dtd/compass-core-
> > > mapping.dtd">
> > > > >
> > > > > <compass-core-mapping package="com.pobox.cbarham.model">
> > > > >         <!-- ============================================= -->
> > > > >         <!--  USER           -->
> > > > >         <!-- ============================================= -->
> > > > >         <class name="User" alias="user" root="true">
> > > > >                 <id name="id" />
> > > > >                 <constant>
> > > > >                         <meta-data>type</meta-data>
> > > > >
<meta-data-value>user</meta-data-value>
> > > > >                 </constant>
> > > > >                 <property name="lastName">
> > > > >                         <meta-data
boost="2">lastName</meta-data>

> > > > >                 </property>
> > > > >                 <property name="firstName">
> > > > >                         <meta-data>firstName</meta-data>
> > > > >                 </property>
> > > > >                 <property name="enabled">
> > > > >                         <meta-data>enabled</meta-data>
> > > > >                 </property>
> > > > >                 <property name="phoneNumber">
> > > > >                         <meta-data>phoneNumber</meta-data>
> > > > >                 </property>
> > > > >                 <property name="email">
> > > > >                         <meta-data>email</meta-data>
> > > > >                 </property>
> > > > >                 <property name="address">
> > > > >                         <meta-data>address</meta-data>
> > > > >                 </property>
> > > > >                 <property name="email">
> > > > >                         <meta-data>email</meta-data>
> > > > >                 </property>
> > > > >                 <property name="accountExpired">
> > > > >                         <meta-data>accountExpired</meta-data>
> > > > >                 </property>
> > > > >                 <property name="accountLocked">
> > > > >                         <meta-data>accountLocked</meta-data>
> > > > >                 </property>
> > > > >                 <property name="username">
> > > > >                         <meta-data>username</meta-data>
> > > > >                 </property>
> > > > >                 <property name="website">
> > > > >                         <meta-data>website</meta-data>
> > > > >                 </property>
> > > > >
> > > > >                 <component name="roles" ref-alias="role" />
> > > > >                 <component name="address" ref-alias="address"
/>
> > > > >         </class>
> > > > >         <!-- ============================================= -->
> > > > >         <!--  ROLE            -->
> > > > >         <!-- ============================================= -->
> > > > >         <class name="Role" alias="role" root="false">
> > > > >                 <id name="id" />
> > > > >                 <constant>
> > > > >                         <meta-data>type</meta-data>
> > > > >
<meta-data-value>role</meta-data-value>

> > > > >                 </constant>
> > > > >                 <property name="description">
> > > > >                         <meta-data>description</meta-data>
> > > > >                 </property>
> > > > >                 <property name="name">
> > > > >                         <meta-data>name</meta-data>
> > > > >                 </property>
> > > > >         </class>
> > > > >         <!-- ============================================= -->
> > > > >         <!--  ADDRESS            -->
> > > > >         <!-- ============================================= -->
> > > > >         <class name="Address" alias="address" root="false">
> > > > >                 <constant>
> > > > >                         <meta-data>type</meta-data>
> > > > >
<meta-data-value>address</meta-data-value>

> > > > >                 </constant>
> > > > >                 <property name="address">
> > > > >                         <meta-data>address</meta-data>
> > > > >                 </property>
> > > > >                 <property name="city">
> > > > >                         <meta-data>address</meta-data>
> > > > >                 </property>
> > > > >                 <property name="country">
> > > > >                         <meta-data>address</meta-data>
> > > > >                 </property>
> > > > >                 <property name="postalCode">
> > > > >                         <meta-data>address</meta-data>
> > > > >                 </property>
> > > > >                 <property name="province">
> > > > >                         <meta-data>address</meta-data>
> > > > >                 </property>
> > > > >         </class>
> > > > >
> > > > > </compass-core-mapping>
> > > > >
> > > > > 8.      Edit
> > src/service/.../service/applicationContext-service.xml
> > > > >  And add the compass spring beans: (change the resource
locations
> > > > > accordingly) - also note that this puts the index on the root
> > > > > filesystem in a directory called compass
> > > > >
> > > > >         <!-- COMPASS START -->
> > > > >         <bean id="compass"
> > > class="org.compass.spring.LocalCompassBean">
> > > > >                 <property name="resourceLocations">
> > > > >                         <list>
> > > > >
<value>classpath:{PATH-TO-MODEL}
> > > /model/weblogs.cmd.xml</value>
> > > > >                                 <value>classpath:
:{PATH-TO-MODEL

> > > /model/weblogs.cpm.xml</value>
> > > > >                         </list>
> > > > >                 </property>
> > > > >                 <property name="compassSettings">
> > > > >                         <props>
> > > > >                                 <prop
> > > key="compass.engine.connection">file:///compass/weblogs</prop>
> > > > >                                 <prop
> > >
> >
key="compass.transaction.factory">org.compass.spring.transaction.SpringS

> > yn
> > > cTransactionFactory</prop>
> > > > >                         </props>
> > > > >                 </property>
> > > > >                 <property name="transactionManager"
> > > ref="transactionManager" />
> > > > >         </bean>
> > > > >         <bean id="hibernateGpsDevice"
> > > > >
> >
class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">

> > > > >                 <property name="name">
> > > > >                         <value>hibernateDevice</value>
> > > > >                 </property>
> > > > >                 <property name="sessionFactory"
> > ref="sessionFactory"
> > > />
> > > > >
> > > > >         </bean>
> > > > >         <bean id="compassGps"
> > > class="org.compass.gps.impl.SingleCompassGps"
> > > > > init-method="start" destroy-method="stop">
> > > > >                 <property name="compass">
> > > > >                         <ref bean="compass" />
> > > > >                 </property>
> > > > >                 <property name="gpsDevices">
> > > > >                         <list>
> > > > >                                 <bean
> > >
> >
class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">
> > > > >                                         <property
name="gpsDevice"

> > > ref="hibernateGpsDevice" />
> > > > >                                 </bean>
> > > > >                         </list>
> > > > >                 </property>
> > > > >         </bean>
> > > > >         <!-- COMPASS END -->
> > > > >
> > > > > 9.      Add in the JSP's to drive the index and search....
> > > > > a.       Under web/pages add a reindex.jsp:
> > > > > <%@ include file="/common/taglibs.jsp"%>
> > > > > <P>
> > > > > <H2>Compass Index</H2>
> > > > > <P>
> > > > > Use the Index button to index the database using Compass::Gps.
The
> > > > > operation will
> > > > > delete the current index and reindex the database based on the
> > > > > mappings and devices
> > > > > defined in the Compass::Gps configuration context.
> > > > > <FORM method="POST" action="<c:url value="/reindex.html"/>">
> > > > >         <spring:bind path="command.doIndex">
> > > > >                 <INPUT type="hidden" name="doIndex"
value="true"
> > />
> > > > >         </spring:bind>
> > > > >     <INPUT type="submit" value="Index"/>
> > > > > </FORM>
> > > > > <c:if test="${! empty indexResults}">
> > > > >         <P>Indexing took: <c:out
value="${indexResults.indexTime}"

> > > />ms.
> > > > > </c:if>
> > > > > <P>
> > > > >
> > > > > b.      under web/pages add search.jsp:
> > > > > <%@ include file="/common/taglibs.jsp"%>
> > > > > <title>Search</title>
> > > > > <content tag="heading">
> > > > > Search:
> > > > > </content>
> > > > > <FORM method="GET">
> > > > >         <spring:bind path="command.query">
> > > > >                 <INPUT type="text" size="20" name="query"
> > > value="<c:out
> > > > > value="${status.value}"/> " />
> > > > >         </spring:bind>
> > > > >
> > > > >         <P />
> > > > >                 <INPUT type="submit" value="Search" />
> > > > > </FORM>
> > > > > <p />
> > > > >         <c:if test="${! empty searchResults}">
> > > > >                 <P />
> > > > >                         Search took
> > > > >                         <c:out
value="${searchResults.searchTime}"

> > />
> > > > >                         ms
> > > > >                 <P />
> > > > >                 <TABLE border="2">
> > > > >                         <TR>
> > > > >                                 <TH>
> > > > >                                         SCORE
> > > > >                                 </TH>
> > > > >                                 <TH>
> > > > >                                         TYPE
> > > > >                                 </TH>
> > > > >                                 <TH>
> > > > >                                         ID
> > > > >                                 </TH>
> > > > >                         </TR>
> > > > >
> > > > >                         <c:forEach var="hit"
> > > items="${searchResults.hits}">
> > > > >                                 <P />
> > > > >                                 <TR>
> > > > >                                         <TD>
> > > > >
<fmt:formatNumber

> > > type="percent" value="${hit.score}" />
> > > > >                                         </TD>
> > > > >                                         <TD>
> > > > >                                                 <c:out
> > > value="${hit.alias}" />
> > > > >
> > > > >                                         </TD>
> > > > >                                         <TD>
> > > > >                                                 <c:out
> > > value="${hit.data.id}" />
> > > > >                                         </TD>
> > > > >                                 </TR>
> > > > >                         </c:forEach>
> > > > >                 </TABLE>
> > > > >
> > > > >         </c:if>
> > > > >
> > > > > c.      Wire up the controllers - edit
> > web/WEB-INF/action-servlet.xml
> > > and
> > > > > add these beans:
> > > > >
> > > > >         <bean id="searchController"
> > > > > class="org.compass.spring.web.mvc.CompassSearchController">
> > > > >                 <property name="compass"><ref
> > > bean="compass"/></property>
> > > > >                 <property
> > > name="searchView"><value>searchView</value></property>
> > > > >                 <property
> > >
name="searchResultsView"><value>searchResultsView</value></property>

> > > > >                 <property
> > name="pageSize"><value>10</value></property>
> > > > >         </bean>
> > > > >         <!-- ====  COMPASS SEARCH CONTROLLER ==== -->
> > > > >
> > > > >         <bean id="indexController"
> > > > > class="org.compass.spring.web.mvc.CompassIndexController">
> > > > >                 <property name="compassGps"><ref
> > > bean="compassGps"/></property>
> > > > >                 <property
> > > name="indexView"><value>reindexView</value></property>
> > > > >                 <property
> > >
name="indexResultsView"><value>reindexResultsView</value></property>
> > > > >         </bean>
> > > > >
> > > > >     <!-- View Resolver for JSPs -->
> > > > >         <bean id="rbViewResolver"
> > > > >
> > >
> >
class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
> > > > >                 <property
> > > name="basename"><value>views</value></property>
> > > > >                 <property
name="order"><value>0</value></property>

> > > > >         </bean>
> > > > > d.      Also add them into the urlMapping:
> > > > >         <prop key="/search.html">searchController</prop>
> > > > > <prop key="/reindex.html">indexController</prop>
> > > > >
> > > > > e.      Add a file views.properties under web/WEB-INF/classes
> > > containing:
> > > > > searchView.class=org.springframework.web.servlet.view.JstlView
> > > > > searchView.url=/WEB-INF/pages/search.jsp
> > > > >
> > > > >
> >
searchResultsView.class=org.springframework.web.servlet.view.JstlView
> > > > > searchResultsView.url=/WEB-INF/pages/search.jsp
> > > > >
> > > > >
reindexView.class=org.springframework.web.servlet.view.JstlView
> > > > > reindexView.url=/WEB-INF/pages/reindex.jsp
> > > > >
> > > > >
> >
reindexResultsView.class=org.springframework.web.servlet.view.JstlView

> > > > > reindexResultsView.url=/WEB-INF/pages/reindex.jsp
> > > > >
> > > > > f.      Add in menu - edit menu-config in web/WEB-INF add the
> > reindex
> > > to
> > > > > the admin menu:
> > > > > <Item name="ReIndex" title="menu.reindex" page="/reindex.html"
> > > roles="admin" />
> > > > > g.      add search to it's own menu:
> > > > >         <Menu name="SearchMenu" title="menu.search"
> > > page="/search.html" wifth="60" />
> > > > > h.      now edit /web/pages/menu/jsp to add the new search
menu:

> > > > > <menu:displayMenu name="FileUpload"/>
> > > > > <menu:displayMenu name="SearchMenu"/> <!--  ADDED LiNE -->
> > > > >  <menu:displayMenu name="AdminMenu"/>
> > > > > i.      add the menu properties in
> > > > > WEB-INF/classes/ApplicationResources.properties :
> > > > > menu.search=Search
> > > > > menu.reindex=Re-Index
> > > > >
> > > > >
> > > > > Cheers
> > > > > Chris
> > > > >
> > > > > --
> > > > > -------------------------------------------------
> > > > > Christopher Barham
> > > > > [hidden email]
> > > > >
> > > > >
> >
---------------------------------------------------------------------
> > > > > To unsubscribe, e-mail: [hidden email]
> > > > > For additional commands, e-mail:
[hidden email]
> > > > >
> > > > >
> > > >
> > > >
> >
---------------------------------------------------------------------

> > > > To unsubscribe, e-mail: [hidden email]
> > > > For additional commands, e-mail: [hidden email]
> > > >
> > > >
> > > >
> > >
> > >
> > > --
> > > -------------------------------------------------
> > > Christopher Barham
> > > [hidden email]
> > >
> > >
---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [hidden email]
> > > For additional commands, e-mail: [hidden email]
> > >
> >
> >
> >
---------------------------------------------------------------------
> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Chris Barham

Re: RE: search - integrate compass (lucene) and appfuse

Reply Threaded More More options
Print post
Permalink
In reply to this post by Matt Stine
Hi,
Ref the Compass integration, I know I went a bit quiet on the proposed
extensions, (Displaytag and highlight results), but I have hit some
problems that perhaps could use some input from those interested in
pursuing this, especially as Matt has reworked this for JSF.

A development spike of an extension giving a highlighting, displaytag
solution has been built, and I've put the relevant source changes up
for download/comments; I would welcome some feedback about it:
source files are in the archive file named searchResultsHighlighting.zip
at http://tinyurl.com/g9htz

We've built the Displaytag extension, It uses displaytags external paging
interface to offload paging work back to the spring controller, so
only one page of search result data at a time is in the
response/session.  This is required as detaching all compasshits is
specifically warned against in the Compass docs.
The Highlighter results are coming back now, but need tuning.

Issues with this implementation approach:
1) The major problem is that the results highlighter object can
sometimes be empty, if there are multiple entries for the same
metadata item, and the first does not contain a hit. (Compass feature
- it only returns the first)
2) If there are multiple metadata entries for a property, each is a
hit and gets returned as a highlight result, which pollutes the
highlight results with multiple highlights for the same property.
3) It should be lazy loading the hits, (in the super implementation
of the spring controller), and displaytag set to paging them
externally through this - but I haven't got a good enough idea of how
to build a test of this - looking for ideas how to mock this out and
build a good test
4) I couldn't get displaytag format="{0,number,percent}" to work as an
attribute on the score property, so put a helper method in
SearchResult to get percentages formatted.
5) In Spring 2.0 this statement:
Errors errors = (Errors) mv.getModel().get(
                                BindException.ERROR_KEY_PREFIX + "searchCommand");
is deprecated, but I couldn't work out how it ought to be reworked now :-(

Any comments, pointers or assistance is most welcome.

Regards,
Chris




On 7/8/06, Stine, Matt <[hidden email]> wrote:

> Just wanted to let you guys know that I'm working on a JSF version of
> this tutorial.  Everything will be the same up until the point that
> Spring MVC came into play.  I've basically pilfered the source of the
> Spring controllers and turned them into backing beans.  It works out
> quite nicely.
>
> I'll post them up once they're working nicely.
>
> - Matt
> [hidden email]
>

-------------------------------------------------
Christopher Barham
[hidden email]

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Matt Raible-3

Re: RE: search - integrate compass (lucene) and appfuse

Reply Threaded More More options
Print post
Permalink
On 7/9/06, Chris Barham <[hidden email]> wrote:

> Hi,
> Ref the Compass integration, I know I went a bit quiet on the proposed
> extensions, (Displaytag and highlight results), but I have hit some
> problems that perhaps could use some input from those interested in
> pursuing this, especially as Matt has reworked this for JSF.
>
> A development spike of an extension giving a highlighting, displaytag
> solution has been built, and I've put the relevant source changes up
> for download/comments; I would welcome some feedback about it:
> source files are in the archive file named searchResultsHighlighting.zip
> at http://tinyurl.com/g9htz
>
> We've built the Displaytag extension, It uses displaytags external paging
> interface to offload paging work back to the spring controller, so
> only one page of search result data at a time is in the
> response/session.  This is required as detaching all compasshits is
> specifically warned against in the Compass docs.
> The Highlighter results are coming back now, but need tuning.
>
> Issues with this implementation approach:
> 1) The major problem is that the results highlighter object can
> sometimes be empty, if there are multiple entries for the same
> metadata item, and the first does not contain a hit. (Compass feature
> - it only returns the first)
> 2) If there are multiple metadata entries for a property, each is a
> hit and gets returned as a highlight result, which pollutes the
> highlight results with multiple highlights for the same property.
> 3) It should be lazy loading the hits, (in the super implementation
> of the spring controller), and displaytag set to paging them
> externally through this - but I haven't got a good enough idea of how
> to build a test of this - looking for ideas how to mock this out and
> build a good test
> 4) I couldn't get displaytag format="{0,number,percent}" to work as an
> attribute on the score property, so put a helper method in
> SearchResult to get percentages formatted.
> 5) In Spring 2.0 this statement:
> Errors errors = (Errors) mv.getModel().get(
>                                 BindException.ERROR_KEY_PREFIX + "searchCommand");
> is deprecated, but I couldn't work out how it ought to be reworked now :-(

The new constant is MODEL_KEY_PREFIX.

Matt

>
> Any comments, pointers or assistance is most welcome.
>
> Regards,
> Chris
>
>
>
>
> On 7/8/06, Stine, Matt <[hidden email]> wrote:
> > Just wanted to let you guys know that I'm working on a JSF version of
> > this tutorial.  Everything will be the same up until the point that
> > Spring MVC came into play.  I've basically pilfered the source of the
> > Spring controllers and turned them into backing beans.  It works out
> > quite nicely.
> >
> > I'll post them up once they're working nicely.
> >
> > - Matt
> > [hidden email]
> >
>
> -------------------------------------------------
> Christopher Barham
> [hidden email]
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Matt Stine

RE: RE: search - integrate compass (lucene) and appfuse

Reply Threaded More More options
Print post
Permalink
In reply to this post by Matt Stine
I'll take a look at the external paging when I get a chance - that would
be quite useful for our application.  Highlighting isn't really required
for us now so I probably won't be able to spend too much time on it.

Thanks for your continued efforts!

- Matt
[hidden email]
> -----Original Message-----
> From: [hidden email] [mailto:[hidden email]] On Behalf Of Chris
Barham
> Sent: Sunday, July 09, 2006 5:00 AM
> To: [hidden email]; Stine, Matt
> Subject: Re: RE: [appfuse-user] search - integrate compass (lucene)
and

> appfuse
>
> Hi,
> Ref the Compass integration, I know I went a bit quiet on the proposed
> extensions, (Displaytag and highlight results), but I have hit some
> problems that perhaps could use some input from those interested in
> pursuing this, especially as Matt has reworked this for JSF.
>
> A development spike of an extension giving a highlighting, displaytag
> solution has been built, and I've put the relevant source changes up
> for download/comments; I would welcome some feedback about it:
> source files are in the archive file named
searchResultsHighlighting.zip
> at http://tinyurl.com/g9htz
>
> We've built the Displaytag extension, It uses displaytags external
paging

> interface to offload paging work back to the spring controller, so
> only one page of search result data at a time is in the
> response/session.  This is required as detaching all compasshits is
> specifically warned against in the Compass docs.
> The Highlighter results are coming back now, but need tuning.
>
> Issues with this implementation approach:
> 1) The major problem is that the results highlighter object can
> sometimes be empty, if there are multiple entries for the same
> metadata item, and the first does not contain a hit. (Compass feature
> - it only returns the first)
> 2) If there are multiple metadata entries for a property, each is a
> hit and gets returned as a highlight result, which pollutes the
> highlight results with multiple highlights for the same property.
> 3) It should be lazy loading the hits, (in the super implementation
> of the spring controller), and displaytag set to paging them
> externally through this - but I haven't got a good enough idea of how
> to build a test of this - looking for ideas how to mock this out and
> build a good test
> 4) I couldn't get displaytag format="{0,number,percent}" to work as an
> attribute on the score property, so put a helper method in
> SearchResult to get percentages formatted.
> 5) In Spring 2.0 this statement:
> Errors errors = (Errors) mv.getModel().get(
> BindException.ERROR_KEY_PREFIX +
"searchCommand");
> is deprecated, but I couldn't work out how it ought to be reworked now
:-(

>
> Any comments, pointers or assistance is most welcome.
>
> Regards,
> Chris
>
>
>
>
> On 7/8/06, Stine, Matt <[hidden email]> wrote:
> > Just wanted to let you guys know that I'm working on a JSF version
of
> > this tutorial.  Everything will be the same up until the point that
> > Spring MVC came into play.  I've basically pilfered the source of
the

> > Spring controllers and turned them into backing beans.  It works out
> > quite nicely.
> >
> > I'll post them up once they're working nicely.
> >
> > - Matt
> > [hidden email]
> >
>
> -------------------------------------------------
> Christopher Barham
> [hidden email]


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Matt Raible-3

Re: search - integrate compass (lucene) and appfuse

Reply Threaded More More options
Print post
Permalink
In reply to this post by Matt Stine
Thanks Matt!  You guys are going to have the 2.1 features done before
we even get started on 2.0. ;-)

Matt

On 7/7/06, Stine, Matt <[hidden email]> wrote:

> Just wanted to let you guys know that I'm working on a JSF version of
> this tutorial.  Everything will be the same up until the point that
> Spring MVC came into play.  I've basically pilfered the source of the
> Spring controllers and turned them into backing beans.  It works out
> quite nicely.
>
> I'll post them up once they're working nicely.
>
> - Matt
> [hidden email]
>
> > -----Original Message-----
> > From: [hidden email] [mailto:[hidden email]] On Behalf Of Chris
> Barham
> > Sent: Monday, June 26, 2006 9:17 PM
> > To: [hidden email]
> > Subject: Re: [appfuse-user] search - integrate compass (lucene) and
> > appfuse
> >
> > Hi Matt,
> >
> > Shay did a review over at the Compass forum and made some suggestions.
> >  I will rework and incorporate them.  Also, as I will have to do this
> > anyway, I will try to rework the Spring Controller to give a
> > DisplayTag-able List and return the search hit highlight terms.
> >
> > Once done I'll repost.
> >
> > Shay's comments are at http://tinyurl.com/f9qm9  (which is
> > http://forums.opensymphony.com/thread.jspa?threadID=35452&tstart=0 for
> > those allergic to snipurl/tinurl :-) )
> >
> > Regards,
> > Chris
> >
> >
> >
> > On 6/24/06, Matt Raible <[hidden email]> wrote:
> > > Great work Chris!  Thanks for the detailed instructions.  Hopefully
> > > someone else can "tech review" them and we can get them on the wiki,
> > > or possibly published in an article on java.net.  If anyone is
> > > interested in writing an article for java.net (or another site), let
> > > me know.  I can probably hook you up.
> > >
> > > Matt
> > >
> > > On 6/23/06, Chris Barham <[hidden email]> wrote:
> > > > Hi,
> > > >
> > > > I've been playing with Compass and Appfuse to give search
> capability.
> > > > I made notes as I was going and post them here in case anyone else
> > > > finds them useful.  A big thanks to Matt and Shay for these two
> > > > projects, they work so well together :-)
> > > >
> > > > This is a barebones setup, my next job, (I think), is to rework
> the
> > > > SpringController to give back a list with highlight terms on the
> > > > search results so that Displaytag can render it, (If anyone has
> done
> > > > this please let me know if this is the best approach).
> > > >
> > > > Once running you can browse the index using Luke
> > http://www.getopt.org/luke/
> > > >
> > > > Steps as follows:
> > > >
> > > > Integrate Compass search with Appfuse
> > > > -----------------------------------------------------
> > > >
> > > > 1.      Get a new latest Appfuse project setup a la
> > > > http://raibledesigns.com/wiki/AppFuseQuickStart.html  For this I
> used
> > > > a project called weblogs, using Spring MVC and hibernate (Apache
> Derby
> > > > as the RDBMS)
> > > > 2.      Get Spring 2.0 (currently Rc1)
> > http://www.springframework.org/download
> > > > 3.      Get Compass (currently 0.9.2SNAPSHOT)
> > http://www.opensymphony.com/compass/
> > > > 4.      Install these...
> > > > a.      Make directories under lib directory place jars as
> follows:
> > > >
> > > > compass-0.9.2-SNAPSHOT
> > > > |-- commons-logging.jar
> > > > |-- compass.jar
> > > > |-- lucene-analyzers.jar
> > > > |-- lucene-core.jar
> > > > |-- lucene-highlighter.jar
> > > > `-- lucene-snowball.jar
> > > >
> > > > and
> > > >
> > > > spring-2.0RC1/
> > > > |-- acegi-security-1.0.0-RC2.jar
> > > > |-- commons-codec-1.3.jar
> > > > |-- ehcache-1.2.jar
> > > > |-- spring-aspects.jar
> > > > |-- spring-mock.jar
> > > > |-- spring.jar
> > > > |-- springmodules-validator-dev-20051217.jar
> > > > `-- validator-rules.xml
> > > >
> > > >
> > > > b.      Change lib.properties:
> > > >
> > > > #
> > > > # Spring Framework - http://www.springframework.org
> > > > #
> > > > spring.version=2.0RC1
> > > > spring.dir=${lib.dir}/spring-${spring.version}
> > > > spring.jar=${spring.dir}/spring.jar
> > > >
> > > > #
> > > > # Compass search http://www.opensymphony.com/compass/
> > > > #
> > > > compass.version=0.9.2-SNAPSHOT
> > > > compass.dir=${lib.dir}/compass-${compass.version}
> > > >
> > > > 5.      Add compass to the service.compile.classpath and
> > > > web.compile.classpath in properties.xml:
> > > >         <fileset dir="${compass.dir}" includes="*.jar" />
> > > > 6.      Add the compass jars to the war task in build.xml (so they
> get
> > > > copied into the war)
> > > >          <lib dir="${compass.dir}" includes="*.jar"/>
> > > > 7.      Add the metadata files to src/dao/../model/
> > > > Weblogs.cmd.xml - common metadata (optional) - this doesn't get
> used
> > > > in this example
> > > > E.g.:
> > > > <?xml version="1.0"?>
> > > > <!DOCTYPE compass-core-meta-data PUBLIC
> > > >     "-//Compass/Compass Core Meta Data DTD 1.0//EN"
> > > >     "http://www.opensymphony.com/compass/dtd/compass-core-meta-
> > data.dtd">
> > > >
> > > > <compass-core-meta-data>
> > > >         <meta-data-group id="weblogs" displayName="Weblogs Meta
> Data">
> > > >                 <description>mongoose Meta Data</description>
> > > >                  <uri>http://compass/weblogs</uri>
> > > >                 <meta-data id="createddate"
> displayName="createddate">
> > > >                         <description>CreatedDate</description>
> > > >
> <uri>http://compass/weblogs/createddate</uri>
> > > >                         <name
> format="dd/MM/yyyy">createddate</name>
> > > >                 </meta-data>
> > > >         </meta-data-group>
> > > > </compass-core-meta-data>
> > > >
> > > >
> > > > Mapping metadata: weblogs.cpm.xml
> > > >
> > > > <?xml version="1.0"?>
> > > > <!DOCTYPE compass-core-mapping PUBLIC
> > > >     "-//Compass/Compass Core Mapping DTD 1.0//EN"
> > > >     "http://www.opensymphony.com/compass/dtd/compass-core-
> > mapping.dtd">
> > > >
> > > > <compass-core-mapping package="com.pobox.cbarham.model">
> > > >         <!-- ============================================= -->
> > > >         <!--  USER           -->
> > > >         <!-- ============================================= -->
> > > >         <class name="User" alias="user" root="true">
> > > >                 <id name="id" />
> > > >                 <constant>
> > > >                         <meta-data>type</meta-data>
> > > >                         <meta-data-value>user</meta-data-value>
> > > >                 </constant>
> > > >                 <property name="lastName">
> > > >                         <meta-data boost="2">lastName</meta-data>
> > > >                 </property>
> > > >                 <property name="firstName">
> > > >                         <meta-data>firstName</meta-data>
> > > >                 </property>
> > > >                 <property name="enabled">
> > > >                         <meta-data>enabled</meta-data>
> > > >                 </property>
> > > >                 <property name="phoneNumber">
> > > >                         <meta-data>phoneNumber</meta-data>
> > > >                 </property>
> > > >                 <property name="email">
> > > >                         <meta-data>email</meta-data>
> > > >                 </property>
> > > >                 <property name="address">
> > > >                         <meta-data>address</meta-data>
> > > >                 </property>
> > > >                 <property name="email">
> > > >                         <meta-data>email</meta-data>
> > > >                 </property>
> > > >                 <property name="accountExpired">
> > > >                         <meta-data>accountExpired</meta-data>
> > > >                 </property>
> > > >                 <property name="accountLocked">
> > > >                         <meta-data>accountLocked</meta-data>
> > > >                 </property>
> > > >                 <property name="username">
> > > >                         <meta-data>username</meta-data>
> > > >                 </property>
> > > >                 <property name="website">
> > > >                         <meta-data>website</meta-data>
> > > >                 </property>
> > > >
> > > >                 <component name="roles" ref-alias="role" />
> > > >                 <component name="address" ref-alias="address" />
> > > >         </class>
> > > >         <!-- ============================================= -->
> > > >         <!--  ROLE            -->
> > > >         <!-- ============================================= -->
> > > >         <class name="Role" alias="role" root="false">
> > > >                 <id name="id" />
> > > >                 <constant>
> > > >                         <meta-data>type</meta-data>
> > > >                         <meta-data-value>role</meta-data-value>
> > > >                 </constant>
> > > >                 <property name="description">
> > > >                         <meta-data>description</meta-data>
> > > >                 </property>
> > > >                 <property name="name">
> > > >                         <meta-data>name</meta-data>
> > > >                 </property>
> > > >         </class>
> > > >         <!-- ============================================= -->
> > > >         <!--  ADDRESS            -->
> > > >         <!-- ============================================= -->
> > > >         <class name="Address" alias="address" root="false">
> > > >                 <constant>
> > > >                         <meta-data>type</meta-data>
> > > >                         <meta-data-value>address</meta-data-value>
> > > >                 </constant>
> > > >                 <property name="address">
> > > >                         <meta-data>address</meta-data>
> > > >                 </property>
> > > >                 <property name="city">
> > > >                         <meta-data>address</meta-data>
> > > >                 </property>
> > > >                 <property name="country">
> > > >                         <meta-data>address</meta-data>
> > > >                 </property>
> > > >                 <property name="postalCode">
> > > >                         <meta-data>address</meta-data>
> > > >                 </property>
> > > >                 <property name="province">
> > > >                         <meta-data>address</meta-data>
> > > >                 </property>
> > > >         </class>
> > > >
> > > > </compass-core-mapping>
> > > >
> > > > 8.      Edit
> src/service/.../service/applicationContext-service.xml
> > > >  And add the compass spring beans: (change the resource locations
> > > > accordingly) - also note that this puts the index on the root
> > > > filesystem in a directory called compass
> > > >
> > > >         <!-- COMPASS START -->
> > > >         <bean id="compass"
> > class="org.compass.spring.LocalCompassBean">
> > > >                 <property name="resourceLocations">
> > > >                         <list>
> > > >                                 <value>classpath:{PATH-TO-MODEL}
> > /model/weblogs.cmd.xml</value>
> > > >                                 <value>classpath: :{PATH-TO-MODEL
> > /model/weblogs.cpm.xml</value>
> > > >                         </list>
> > > >                 </property>
> > > >                 <property name="compassSettings">
> > > >                         <props>
> > > >                                 <prop
> > key="compass.engine.connection">file:///compass/weblogs</prop>
> > > >                                 <prop
> >
> key="compass.transaction.factory">org.compass.spring.transaction.SpringS
> yn
> > cTransactionFactory</prop>
> > > >                         </props>
> > > >                 </property>
> > > >                 <property name="transactionManager"
> > ref="transactionManager" />
> > > >         </bean>
> > > >         <bean id="hibernateGpsDevice"
> > > >
> class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">
> > > >                 <property name="name">
> > > >                         <value>hibernateDevice</value>
> > > >                 </property>
> > > >                 <property name="sessionFactory"
> ref="sessionFactory"
> > />
> > > >
> > > >         </bean>
> > > >         <bean id="compassGps"
> > class="org.compass.gps.impl.SingleCompassGps"
> > > > init-method="start" destroy-method="stop">
> > > >                 <property name="compass">
> > > >                         <ref bean="compass" />
> > > >                 </property>
> > > >                 <property name="gpsDevices">
> > > >                         <list>
> > > >                                 <bean
> >
> class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">
> > > >                                         <property name="gpsDevice"
> > ref="hibernateGpsDevice" />
> > > >                                 </bean>
> > > >                         </list>
> > > >                 </property>
> > > >         </bean>
> > > >         <!-- COMPASS END -->
> > > >
> > > > 9.      Add in the JSP's to drive the index and search....
> > > > a.       Under web/pages add a reindex.jsp:
> > > > <%@ include file="/common/taglibs.jsp"%>
> > > > <P>
> > > > <H2>Compass Index</H2>
> > > > <P>
> > > > Use the Index button to index the database using Compass::Gps. The
> > > > operation will
> > > > delete the current index and reindex the database based on the
> > > > mappings and devices
> > > > defined in the Compass::Gps configuration context.
> > > > <FORM method="POST" action="<c:url value="/reindex.html"/>">
> > > >         <spring:bind path="command.doIndex">
> > > >                 <INPUT type="hidden" name="doIndex" value="true"
> />
> > > >         </spring:bind>
> > > >     <INPUT type="submit" value="Index"/>
> > > > </FORM>
> > > > <c:if test="${! empty indexResults}">
> > > >         <P>Indexing took: <c:out value="${indexResults.indexTime}"
> > />ms.
> > > > </c:if>
> > > > <P>
> > > >
> > > > b.      under web/pages add search.jsp:
> > > > <%@ include file="/common/taglibs.jsp"%>
> > > > <title>Search</title>
> > > > <content tag="heading">
> > > > Search:
> > > > </content>
> > > > <FORM method="GET">
> > > >         <spring:bind path="command.query">
> > > >                 <INPUT type="text" size="20" name="query"
> > value="<c:out
> > > > value="${status.value}"/> " />
> > > >         </spring:bind>
> > > >
> > > >         <P />
> > > >                 <INPUT type="submit" value="Search" />
> > > > </FORM>
> > > > <p />
> > > >         <c:if test="${! empty searchResults}">
> > > >                 <P />
> > > >                         Search took
> > > >                         <c:out value="${searchResults.searchTime}"
> />
> > > >                         ms
> > > >                 <P />
> > > >                 <TABLE border="2">
> > > >                         <TR>
> > > >                                 <TH>
> > > >                                         SCORE
> > > >                                 </TH>
> > > >                                 <TH>
> > > >                                         TYPE
> > > >                                 </TH>
> > > >                                 <TH>
> > > >                                         ID
> > > >                                 </TH>
> > > >                         </TR>
> > > >
> > > >                         <c:forEach var="hit"
> > items="${searchResults.hits}">
> > > >                                 <P />
> > > >                                 <TR>
> > > >                                         <TD>
> > > >                                                 <fmt:formatNumber
> > type="percent" value="${hit.score}" />
> > > >                                         </TD>
> > > >                                         <TD>
> > > >                                                 <c:out
> > value="${hit.alias}" />
> > > >
> > > >                                         </TD>
> > > >                                         <TD>
> > > >                                                 <c:out
> > value="${hit.data.id}" />
> > > >                                         </TD>
> > > >                                 </TR>
> > > >                         </c:forEach>
> > > >                 </TABLE>
> > > >
> > > >         </c:if>
> > > >
> > > > c.      Wire up the controllers - edit
> web/WEB-INF/action-servlet.xml
> > and
> > > > add these beans:
> > > >
> > > >         <bean id="searchController"
> > > > class="org.compass.spring.web.mvc.CompassSearchController">
> > > >                 <property name="compass"><ref
> > bean="compass"/></property>
> > > >                 <property
> > name="searchView"><value>searchView</value></property>
> > > >                 <property
> > name="searchResultsView"><value>searchResultsView</value></property>
> > > >                 <property
> name="pageSize"><value>10</value></property>
> > > >         </bean>
> > > >         <!-- ====  COMPASS SEARCH CONTROLLER ==== -->
> > > >
> > > >         <bean id="indexController"
> > > > class="org.compass.spring.web.mvc.CompassIndexController">
> > > >                 <property name="compassGps"><ref
> > bean="compassGps"/></property>
> > > >                 <property
> > name="indexView"><value>reindexView</value></property>
> > > >                 <property
> > name="indexResultsView"><value>reindexResultsView</value></property>
> > > >         </bean>
> > > >
> > > >     <!-- View Resolver for JSPs -->
> > > >         <bean id="rbViewResolver"
> > > >
> >
> class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
> > > >                 <property
> > name="basename"><value>views</value></property>
> > > >                 <property name="order"><value>0</value></property>
> > > >         </bean>
> > > > d.      Also add them into the urlMapping:
> > > >         <prop key="/search.html">searchController</prop>
> > > > <prop key="/reindex.html">indexController</prop>
> > > >
> > > > e.      Add a file views.properties under web/WEB-INF/classes
> > containing:
> > > > searchView.class=org.springframework.web.servlet.view.JstlView
> > > > searchView.url=/WEB-INF/pages/search.jsp
> > > >
> > > >
> searchResultsView.class=org.springframework.web.servlet.view.JstlView
> > > > searchResultsView.url=/WEB-INF/pages/search.jsp
> > > >
> > > > reindexView.class=org.springframework.web.servlet.view.JstlView
> > > > reindexView.url=/WEB-INF/pages/reindex.jsp
> > > >
> > > >
> reindexResultsView.class=org.springframework.web.servlet.view.JstlView
> > > > reindexResultsView.url=/WEB-INF/pages/reindex.jsp
> > > >
> > > > f.      Add in menu - edit menu-config in web/WEB-INF add the
> reindex
> > to
> > > > the admin menu:
> > > > <Item name="ReIndex" title="menu.reindex" page="/reindex.html"
> > roles="admin" />
> > > > g.      add search to it's own menu:
> > > >         <Menu name="SearchMenu" title="menu.search"
> > page="/search.html" wifth="60" />
> > > > h.      now edit /web/pages/menu/jsp to add the new search menu:
> > > > <menu:displayMenu name="FileUpload"/>
> > > > <menu:displayMenu name="SearchMenu"/> <!--  ADDED LiNE -->
> > > >  <menu:displayMenu name="AdminMenu"/>
> > > > i.      add the menu properties in
> > > > WEB-INF/classes/ApplicationResources.properties :
> > > > menu.search=Search
> > > > menu.reindex=Re-Index
> > > >
> > > >
> > > > Cheers
> > > > Chris
> > > >
> > > > --
> > > > -------------------------------------------------
> > > > Christopher Barham
> > > > [hidden email]
> > > >
> > > >
> ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: [hidden email]
> > > > For additional commands, e-mail: [hidden email]
> > > >
> > > >
> > >
> > >
> ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [hidden email]
> > > For additional commands, e-mail: [hidden email]
> > >
> > >
> > >
> >
> >
> > --
> > -------------------------------------------------
> > Christopher Barham
> > [hidden email]
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

André Faria-3

css.appfuse.org/themes

Reply Threaded More More options
Print post
Permalink
Some javascript/style in this post has been disabled (why?)
What happen with http://css.appfuse.org/themes?
The server could not locate the document you requested --------------------------------------------------------------------- To unsubscribe, e-mail: [hidden email] For additional commands, e-mail: [hidden email]
Matt Raible-3

Re: css.appfuse.org/themes

Reply Threaded More More options
Print post
Permalink
The goal is that it will host a number of possible themes, all using
the same HTML template.  We still have quite a bit of work to do on it
to make it a reality.  It's possible that someday it will also provide
themes you can download and use in your AppFuse applications.

Matt

On 7/10/06, André Faria <[hidden email]> wrote:
>
>  What happen with http://css.appfuse.org/themes?
>  The server could not locate the document you requested
> ---------------------------------------------------------------------
> To unsubscribe, e-mail:
> [hidden email] For additional
> commands, e-mail: [hidden email]

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]