This looks pretty good. Though many of the features are already baked into PostgreSQL's full-text search, out of the box this seems to add enough value to get me interested. I'll definitely be checking this out further.
Can you clarify... does this addon simply store the Wordnet data inside Postgres, or actually let the postgres full-text search do query-expansion-to-synonyms?
This is nice - We use elasticsearch, but getting good quality has been hard - setting up the tokenizers, filters etc in a good way is tricky, and sometimes our search gives really bad results.
Elasticsearch should be the bootstrap of search imo. Afaics the only interesting bit in this project is the reindex technique. The rest is just trying to make a nice rails idiomatic client library (perhaps for ruby too) around search querying. For a python idiomatic client lib comparison, see mozilla services http://elasticutils.readthedocs.org/en/latest/
Training searches from conversions (self-improving searches) is kinda interesting. Elasticsearch is an amazing product but it can be hard to configure, especially for beginners.
I appreciate that you decided to open-source this project. I do have a few (hopefully) constructive criticisms to make:
1. Using aliases the reindex with near zero downtime is very clever, mad props to Jaroslav Kalistsuk
2. Tire is excellent, I am glad you didn't try to reinvent the wheel here, please keep it that way.
3. Conversion based score boosting, although clever is flawed. Hardcoding values https://github.com/ankane/searchkick/blob/master/lib/searchk... is convoluted. You should consider providing a more flexible DSL to customize how conversion based score is calculated.
I'm curious about this "bad, bad idea" theory too. For our site, I have a handful of hard-coded scoring functions that the site can select from based on search context, and it's far more supportable and debuggable than some of the dynamic query assembly approaches I've tried in the past.
ElasticSearch is a wonderful product that is a real pain to tune, so I'm curious if there's a better approach I'm missing.