Skip to content
High performance real-time search (Support Chinese), indexes store in Redis for Rails application
Ruby
Find file
Pull request Compare This branch is 1 commit ahead, 62 commits behind huacnlee:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib
spec
.DS_Store
.gitignore
.rspec
.travis.yml
CHANGELOG.md
Gemfile
Gemfile.lock
README.md
Rakefile
redis-search.gemspec

README.md

Redis-Search

High performance real-time search (Support Chinese), index in Redis for Rails application

中文介绍和使用说明

Demo

You can try the search feature in 720p.so | shu.im

And there is an Example App to show you how to use redis-search.

Master Status

CI Status

Features

  • Real-time search
  • High performance
  • Segment words search and prefix match search
  • Support match with alias
  • Support ActiveRecord and Mongoid
  • Sort results by one field
  • Homophone search, pinyin search
  • Search as pinyin first chars
  • Conditions support

Requirements

  • Redis 2.2+

Install

  1. In Rails application Gemfile

    gem 'chinese_pinyin', '0.4.1'
    gem 'rmmseg-cpp-huacnlee', '0.2.9'
    gem 'redis-search', '0.9.0'
    $ bundle install

Configure

  • Create file in: config/initializers/redis_search.rb

    require "redis"
    require "redis-namespace"
    require "redis-search"
    # don't forget change namespace
    redis = Redis.new(:host => "127.0.0.1",:port => "6379")
    # We suggest you use a special db in Redis, when you need to clear all data, you can use flushdb command to clear them.
    redis.select(3)
    # Give a special namespace as prefix for Redis key, when your have more than one project used redis-search, this config will make them work fine.
    redis = Redis::Namespace.new("your_app_name:redis_search", :redis => redis)
    Redis::Search.configure do |config|
      config.redis = redis
      config.complete_max_length = 100
      config.pinyin_match = true
      # use rmmseg, true to disable it, it can save memroy
      config.disable_rmmseg = false
    end

Usage

  • Bind Redis::Search callback event, it will to rebuild search indexes when data create or update.

    class Post
      include Mongoid::Document
      include Redis::Search
    
      field :title
      field :body
      field :hits
    
      belongs_to :user
      belongs_to :category
    
      redis_search_index(:title_field => :title,
                         :score_field => :hits,
                         :condition_fields => [:user_id, :category_id],
                         :ext_fields => [:category_name])
    
      def category_name
        self.category.name
      end
    end
    class User
      include Mongoid::Document
      include Redis::Search
    
      field :name
        field :alias_names, :type => Array
      field :tagline
      field :email
      field :followers_count
    
      redis_search_index(:title_field => :name,
                         :alias_field => :alias_names,
                         :prefix_index_enable => true,
                         :score_field => :followers_count,
                         :ext_fields => [:email,:tagline])
    end
    class SearchController < ApplicationController
      # GET /searchs?q=title
      def index
        Redis::Search.query("Post", params[:q], :conditions => {:user_id => 12})
      end
    
      # GET /search_users?q=j
      def search_users
        Redis::Search.complete("Post", params[:q], :conditions => {:user_id => 12, :category_id => 4})
      end
    end

Index data to Redis

If you are first install it in you old project, or your Redis cache lose, you can use this command to rebuild indexes.

$ rake redis_search:index

Documentation

Benchmark test

You can run the rake command (see Rakefile) to make test. There is my performance test result.

Something went wrong with that request. Please try again.