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!