2

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 を実行しています。何か案は?

4

0 に答える 0