Skip to content

Instantly share code, notes, and snippets.

@jugyo
Created August 15, 2012 07:35
Show Gist options
  • Save jugyo/3357397 to your computer and use it in GitHub Desktop.
Save jugyo/3357397 to your computer and use it in GitHub Desktop.

Revisions

  1. jugyo revised this gist Aug 15, 2012. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions full-text-search-by-groonga-and-ruby.md
    Original file line number Diff line number Diff line change
    @@ -2,19 +2,19 @@

    ## groonga のインストール

    brew install groonga
    $ brew install groonga

    ## rroonga のインストール

    Ruby から groonga を使うために rroonga というライブラリを使う:

    gem install rroonga
    $ gem install rroonga

    ## サンプルアプリ

    ブログっぽいデータ構造を作ってそれを検索できるようにしてみる。

    irb -rgroonga
    $ irb -rgroonga

    デフォルトの文字コードを指定:

  2. jugyo revised this gist Aug 15, 2012. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions full-text-search-by-groonga-and-ruby.md
    Original file line number Diff line number Diff line change
    @@ -14,6 +14,8 @@ Ruby から groonga を使うために rroonga というライブラリを使う

    ブログっぽいデータ構造を作ってそれを検索できるようにしてみる。

    irb -rgroonga

    デフォルトの文字コードを指定:

    ```ruby
  3. jugyo created this gist Aug 15, 2012.
    76 changes: 76 additions & 0 deletions full-text-search-by-groonga-and-ruby.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,76 @@
    # Groonga + Ruby で全文検索

    ## groonga のインストール

    brew install groonga

    ## rroonga のインストール

    Ruby から groonga を使うために rroonga というライブラリを使う:

    gem install rroonga

    ## サンプルアプリ

    ブログっぽいデータ構造を作ってそれを検索できるようにしてみる。

    デフォルトの文字コードを指定:

    ```ruby
    Groonga::Context.default_options = {:encoding => :utf8}
    ```

    データベースの作成:

    ```ruby
    Groonga::Database.create(:path => "/tmp/blog.db")
    ```

    スキーマの定義:

    ```ruby
    Groonga::Schema.create_table("Entries") do |table|
    table.short_text("title")
    table.text("content")
    end
    ```

    全文検索用のテーブルを作成:

    ```ruby
    Groonga::Schema.create_table("Terms",
    type: :patricia_trie,
    key_normalize: true,
    default_tokenizer: "TokenBigram"
    ) do |table|
    table.index("Entries.content")
    end
    ```

    `table.index("Entries.content")` としているところがポイント。なんか、こうするらしい。
    `key_normalize: true` で大文字と小文字を区別しないように、 `default_tokenizer: "TokenBigram"` でトークナイザとしてバイグラムを指定している。 `type: :patricia_trie` というのはえーと、何だろうねぇ。

    適当なデータをいくつか追加:

    ```ruby
    Groonga["Entries"].add(title: 'たのしいRuby', content: 'Rubyはたのしい')
    Groonga["Entries"].add(title: '今日の晩ご飯', content: '今日の晩ご飯はカレー')
    ````

    検索:

    ```ruby
    entries = Groonga["Entries"].select {|i| i.content =~ 'ruby'}
    entries.each do |entry|
    puts "#{entry.title}: #{entry.content}"
    end
    ````
    以下が出力されれば成功:
    たのしいRuby: Rubyはたのしい
    ## 参考
    * http://groonga.org/ja/docs/index.html
    * http://groonga.rubyforge.org/rroonga/en/file.tutorial.html