by ankane

ankane / searchjoy

Search analytics made easy

451 Stars 52 Forks Last release: Not found MIT License 213 Commits 22 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:


Search analytics made easy

See it in action


  • view searches in real-time
  • track conversions week over week
  • monitor the performance of top searches

Works with any search platform, including Elasticsearch, Sphinx, and Solr

:cupid: An amazing companion to Searchkick

Build Status


Add this line to your application’s Gemfile:

gem "searchjoy"

And run the generator. This creates a migration to store searches.

rails generate searchjoy:install
rails db:migrate

Next, add the dashboard to your

mount Searchjoy::Engine, at: "searchjoy"

Be sure to protect the endpoint in production - see the Authentication section for ways to do this.

Track Searches

Track searches by creating a record in the database.

  search_type: "Item", # typically the model name
  query: "apple",
  results_count: 12,
  user_id: 1

With Searchkick, you can use the

option to do this automatically."apple", track: {user_id: 1})

If you want to track more attributes, add them to the

add_column :searchjoy_searches, :source, :string

Then, pass the values to the

option."apple", track: {user_id: 1, source: "web"})

It’s that easy.

Track Conversions

First, choose a conversion metric. At Instacart, an item added to the cart from the search results page counts as a conversion.

Next, when a user searches, keep track of the search id. With Searchkick, you can get the id with:

results ="apple", track: true)

When a user converts, find the record and call

search = Searchjoy::Search.find(params[:id])

Better yet, record the model that converted.



Don’t forget to protect the dashboard in production.


In your

authenticate :user, ->(user) { user.admin? } do
  mount Searchjoy::Engine, at: "searchjoy"

Basic Authentication

Set the following variables in your environment or an initializer.


Data Retention

Data should only be retained for as long as it’s needed. Delete older data with:

Searchjoy::Search.where("created_at < ?", 1.year.ago).in_batches.delete_all

You can use Rollup to aggregate important data before you do.


Delete data for a specific user with:

Searchjoy::Search.where(user_id: 1).delete_all


To customize, create an initializer


Change the time zone

Searchjoy.time_zone = "Pacific Time (US & Canada)" # defaults to

Change the number of top searches shown

Searchjoy.top_searches = 500 # defaults to 100

Link to the search results

Searchjoy.query_url = ->(search) { Rails.application.routes.url_helpers.items_path(q: search.query) }

Add additional info to the query in the live stream

Searchjoy.query_name = ->(search) { "#{search.query} #{}" }

Show the conversion name in the live stream

Searchjoy.conversion_name = ->(model) { }


Everyone is encouraged to help improve this project. Here are a few ways you can help:

To get started with development and testing:

git clone
cd searchjoy
bundle install
bundle exec rake test

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.