Rails 4 アプリにtextacular gemを実装しようとしていました。基本検索と詳細検索は正常に機能しますが、あいまい検索を実装しようとすると、問題が発生します。
リポジトリからのインストール手順:
最後に、#fuzzy_search メソッドを使用すると、Postgres のトライグラム検索機能を使用できます。
これを使用するには、データベースに pg_trgm モジュールがインストールされていることを確認する必要があります。開発マシンでは、textacular/tasks を要求して実行できます。
rake textacular:install_trigram
運用環境によっては、rake タスクを使用できる場合もあれば、コマンドを手動で実行する必要がある場合もあります。Postgres 9.1 以降では、次を実行する必要があります。
拡張機能の作成 pg_trgm;
私が試したこと
アプリのルート ディレクトリで実行しようとするrake textacular:install_trigram
と、次のメッセージが表示されます。bundle exec rake textacular:install_trigram
/usr/local/Cellar/postgresql/9.2.4/share/postgresql/extension/pg_trgm.control
rake aborted!
PG::InsufficientPrivilege: ERROR: permission denied to create extension "pg_trgm"
HINT: Must be superuser to create this extension.
: CREATE EXTENSION pg_trgm;
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `exec'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `block in execute'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:425:in `block in log'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:420:in `log'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:127:in `execute'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/gems/textacular-3.1.0/lib/textacular/postgres_module_installer.rb:54:in `install_postgres_91_module'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/gems/textacular-3.1.0/lib/textacular/postgres_module_installer.rb:7:in `install_module'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/gems/textacular-3.1.0/lib/textacular/tasks.rb:14:in `block (2 levels) in <top (required)>'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/bin/ruby_noexec_wrapper:14:in `eval'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/bin/ruby_noexec_wrapper:14:in `<main>'
Tasks: TOP => textacular:install_trigram
これに基づいて、試しsudo rake textacular:install_trigram
てみたところ、次のようになりました。
cannot load such file -- bundler/setup
/Users/ssapra/Sameet/Programming/WebDev/Rails/myapp/config/boot.rb:4:in `<top (required)>'
/Users/ssapra/Sameet/Programming/WebDev/Rails/myapp/config/application.rb:1:in `<top (required)>'
/Users/ssapra/Sameet/Programming/WebDev/Rails/myapp/Rakefile:4:in `<top (required)>'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/bin/ruby_noexec_wrapper:14:in `eval'
/Users/ssapra/.rvm/gems/ruby-2.0.0-p247/bin/ruby_noexec_wrapper:14:in `<main>'
(See full trace by running task with --trace)
最後に、 For Postgres 9.1以降 を読んだ後、実行psql
してみましCREATE EXTENSION pg_trgm;
た。エラーはありません(ただし、いつでも実行すると、既に存在することがわかります)。したがって\quit
、機能するコード行を次のように置き換えます。
@search = Content.advanced_search(params[:search].split(" ").join("|")).basic_search(params[:search])
と:
@search = Content.fuzzy_search(title: params[:search]).fuzzy_search(text: params[:search])
あるいは:
@search = Content.fuzzy_search(params[:search])
そして私はこれを得る:
PG::UndefinedFunction: ERROR: operator does not exist: character varying % unknown
LINE 1: ...NT(*) FROM "contents" WHERE (("contents"."title" % 'inv')) ...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT COUNT(*) FROM "contents" WHERE (("contents"."title" % 'inv')) AND (("contents"."text" % 'inv'))
最初の行でスタックします:
-if @contents.empty?
%p="No results found for: #{@query}"
-elsif !@query.empty?
%p="Your search results for: #{@query}"
コンテンツコントローラー
私のcontents_controller.rb
: 私はこれらの 3 つの追加があります。
require 'textacular'
require 'textacular/tasks'
ActiveRecord::Base.extend(Textacular)
Postgres 9.2.4 を実行しています。何か案は?