PostgreSQL Railscastで全文検索を実行しましたが、奇妙な動作が発生しています。
たとえば、「police」を検索すると結果が得られませんが、「polic」を検索すると結果が得られます。(警察は私が探しているコンテンツに存在します)。また、一部の結果はまったく返されませんが、単語が大きいか小さいかにかかわらず、単語が存在することはわかっています。
Rails dbconsoleを起動すると、psql(9.1.4)を使用していると表示され、アプリの残りの部分も正常に機能しているようです。
インデックスなどを再構築する必要がありますか?
私はPGgemとpostgres_extgemを使用していますが、texticleまたはpg_search gemは使用していません(追加機能は実際には必要ないため)。
それ以外の点では、私のコードはスクリーンキャストと同じです。
def self.text_search(query)
if query.present?
rank = "ts_rank(to_tsvector(name), plainto_tsquery(#{sanitize(query)}))"
where("to_tsvector('english', name) @@ :q
or to_tsvector('english', content) @@ :q", q: query).order("#{rank} desc")
else
scoped
end
end
そして、私はそのようにインデックスを作成しました:
class AddSearchIndexToArticles < ActiveRecord::Migration
def up
execute "create index articles_name on articles using gin(to_tsvector('english', name))"
execute "create index articles_content on articles using gin(to_tsvector('english', content))"
end
end
興味深いことに、where呼び出しでto_tsvectorへの呼び出しを削除すると、次のようになります。
def self.text_search(query)
if query.present?
rank = "ts_rank(to_tsvector(name), plainto_tsquery(#{sanitize(query)}))"
where("name @@ :q
or content @@ :q", q: query).order("#{rank} desc")
else
scoped
end
end
...期待どおりに機能します(インデックスが無視されているように見えるため、非常に遅いことは別として)
何が起こっているのかアイデアはありますか?
アップデート:
フルロギングをオンに切り替えた後、実行されているSQLは次のとおりです。
LOG: statement: SELECT 1
LOG: statement: SELECT "dogs".* FROM "dogs" WHERE (to_tsvector('english', name) @@ 'wary'
or to_tsvector('english', other_names) @@ 'wary'
or to_tsvector('english', origin) @@ 'wary'
or to_tsvector('english', kusa) @@ 'wary') ORDER BY ts_rank(to_tsvector(name), plainto_tsquery('wary'))
desc LIMIT 10 OFFSET 0
LOG: statement: SELECT 1
LOG: statement: SELECT 1
私はSQLの専門家ではありませんが、クエリは問題ないように見えますか?
また、それが関連しているかどうかはわかりませんが、ログファイルには次のようなものもたくさんあります。
FATAL: lock file "postmaster.pid" already exists
HINT: Is another postmaster (PID 821) running in data directory "/usr/local/var/postgres"?
自作でpostgresをインストールし、9.1.4を使用しています