This migration will create a 3rd column named full_text_vector of type tsvector, a gin index, a trigger and a function to update automatically this column.
Over the on keyword, '{"title", 'A'}' means it allows search of the content of "title", with level of priority (weight) "A", which tells postgres than title content is more meaningful than the article content itself.
Now, let's build some models:
classPostinclude Clear::Model #... full_text_searchableend Post.create!({title:"About poney",content:"Poney are cool"}) Post.create!({title:"About dog and cat",content:"Cat and dog are cool. But not as much as poney"}) Post.create!({title:"You won't believe: She raises her poney like as star!",content:"She's col because poney are cool"})
Search is now easily done
Obviously, search call can be chained:
Additional parameters
catalog
Select the catalog to use to build the tsquery. By default, pg_catalog.english is used.
For now, Clear doesn't offers dynamic selection of catalog (for let's say multi-lang service). If your app need this feature, do not hesitate to open an issue.
trigger_name, function_name
In migration, you can change the name generated for the trigger and the function, using theses two keys.
dest_field
The field created in the database, which will contains your ts vector. Default is full_text_vector.
Post.query.search("poney") # Return all the articles !
user = User.find!{ email == "some_email@example.com" }
Post.query.from_user(user).search("orm")
# in your migration:
t.full_text_searchable on: [{"title", 'A'}, {"content", 'C'}], catalog: "pg_catalog.french"
# in your model
full_text_searchable catalog: "pg_catalog.french"
#in your migration
t.full_text_searchable on: [{"title", 'A'}, {"content", 'C'}], dest_field: "tsv"
# in your model
full_text_searchable "tsv"