Thanks to a fantastic tip from Karl on yesterday’s post, I’ve got the searchable plugin up and running on my Grails-RC3 install! Here’s the fix from Karl:

i‘ve got a working Searchable-0.4-SNAPSHOT wo. npe, this is working with the RCs too.
In the plugin‘s java directory u need to slightly modify the
org/codehaus/groovy/grails/plugins/searchable/compass/SearchableCompassUtils.java file.

Here is the “patched” version:
[http://rafb.net/p/prsZip92.html](http://rafb.net/p/prsZip92.html) (nopaste url)

So I patched my version, and I’m up and running. Getting Gravl converted over was a snack. Basically, I just had to remove all my custom code! And, of course, add the magic static searchable=true to my BlogEntry object.

After I patched the plugin, I ran grails install-searchable-config to get a SearchableConfiguration file in my conf directory. From there I could change the compassConnection setting to point to the place I like to store my indexes.

My search action could then shrink to:

def search = {

        def query = params.query
        def blogid = params.blog

        def results = BlogEntry.search(query, params) 

        return [ results: results, query: query ]
    }

The results you get back in ${results.results} are first class domain objects! So it’s pretty much just a matter of a little markup…

<g:each var="result" in="${results.results}">

                <div class='hit'>

                    <div class='hitEntry'>
                        <div class='hitTitle'>
                            <a href='${request.contextPath}/${result.toPermalink()}'>
                                ${result.title}
                            </a>
                        </div>
                        <div class='hitInfo'>
                            <g:niceDate date="${result.created}"/>
                        </div>
                        <p class='hitBody'></p>
                    </div>
                </div>

            </g:each>

Add a g:paginate into the mix, and you’re cooking!

One thing I have lost in the conversion is the ability to do hit term highlighting. I know Compass supports it, so it might just be a matter of digging in a little deeper! I’d also like to be able to store some DynamicMetaData with the index (blogEntry.blog.blogid), but haven’t managed to get the annotations working just yet…

Anyways… a huge code saving. Give it a try on the top right. And thanks Karl, you’re a champion!

Happy searching!