如何使用Ruby Gem ActiveRecord,Sinatra和Postgres进行单词搜索?
我的表看起来像这样:
create_table "posts", :force => true do |t|
t.string "title"
t.text "body"
t.string "image_url"
t.integer "user_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
我试图在标题和正文字段中搜索关键词。
使用ActiveRecord Documentation我尝试Post.find_by(body: "a")
但是我的身体确实包含了字符 a
我知道在Rails中你会做这样的事情:
Post.where(["body LIKE :tag", {:tag => word}])
但我无法弄清楚如何使用Sinatra和Postgres做同样的事情。
答案 0 :(得分:2)
看看postgres的tsearch。 http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/
这是一个非常简单的搜索。有很多选项可供选择,例如,标题中的匹配比正文中的匹配更多。
您可以在表格中添加一个矢量列:
ALTER TABLE posts ADD COLUMN vector tsvector;
然后
UPDATE posts SET vector=('default',coalesce(title,'') ||' '|| coalesce(body,''));
VACUUM FULL ANALYZE;
然后你可以查询:
SELECT * FROM posts WHERE vector @@ to_tsquery('default', 'Test | Zeppelin');
答案 1 :(得分:0)
找不到可以执行此工作的方法,但是使用ActiveRecord Gem运行原始SQL确实可以解决问题:
Post.find_by_sql("SELECT * FROM posts WHERE title LIKE '%word%' OR body LIKE '%word%';")
希望有时会帮助某人......