You can do half queries using 'isl:*' , this will return everything that starts with 'isl'. If you want a multiword search, add in between the words i.e 'sea mon:*'. This will return the row with 'Sea Monster'
Thank you for the detailed step-by-step session. PostgreSQL 12, released later, added generated columns. So we no longer need a trigger to keep the search column updated.
I searched for a full-text search explanation and just clicked on the first video on RU-vid. And this was such luck! Very clear and interesting explanation. Thank you a lot for doing this!
Great video! Not sure if it was already answered, but regarding your last question of 'how to query for half a word' - this seems to be possible with 'to_tsquery' but not 'plainto_tsquery', you can use it like 'to_tsquery('blah:*')'. Greets, Bernd
It is, as long as the input data for true search index lives on the same table. Once you join tables together to make a search index, a generated column doesn’t work.
The tutorial was really great and has helped me get started. However in my use case I have multiple tables to search through and I have achieved it without indexing. How would you index columns from different tables for a single FTS query?
The solution is no longer as elegant, but you create a new table which combines the values you want to search on. Let's say you have a "users" table and a "blog_posts" table. CREATE TABLE searchable_blog_posts ( id SERIAL, user_id INTEGER, blog_post_id INTEGER, search_index tsvector ) CREATE INDEX index_searchable_blog_posts_search_index ON search_index USING GIN(search_index); Then you can populate this "searchable_blog_posts" table using the information you want to be searchable. Then you use triggers to update this `searchable_blog_posts` table whenever either a change is made to the "users" table or the "blog_posts" table.
Ok, you know how people say that they want to do something and don't know how and in the very same day you upload the exact solution? You did it again! By the way at the moment I am using Redis's RediSearch module. It's super fast, I mean hyper fast. But I have some data in Hasura too, so for some data it's overkill to put in Redis. So will see your solution in action.
Great video, the docs on this are pretty dense so this was helpful. It still blows me away how good postgresql is and how much you get essentially for free.
I would recommend against that. Indexing is costly. On a table with 1 million rows, you can expect indexing to take roughly 5 to 10 seconds. Also some indexing locks the table. Index your table with a delayed job that gets performed daily or hourly.
Amazing tutorial good job, just one small issue your trigger does not update new income rows it should have an update statement in the trigger instead of a := e.g. BEGIN UPDATE table_name SET document_with_weights = setWeight(.........) WHERE id = NEW.id; return NEW END
Awesome!, I followed the video and got good results, I also solved the problem of leyword is "isl" to search for "Island", just add "isl: *", but i want to search: when I enter the keyword "land", I want to get "island", I tried with prefixes like: "*: keyword: *", but this is not a good shot and an err sytanx is printed, What do I do with this problem? Any help is appreciated, thanks
I noticed that using tvector make search 2 times slower comparing to "and (like '%abc%' or like '%bcd%'), on top of this tvector performance is not stable, sometimes its say 6 seconds, sometimes 11 seconds to get the response
At 15:18 , the variable "document_with_weights" got the datatype "any" which might be available in this PL but let's say if you had to do this with java or c# .. what datatype do you use for the variable?
postgres will cache query so that benchmark is clearly not prove anything. The only difference is strategy the database plan to perform. At 5:50 you showed 2 query the first is much slower than the second. However, look at the strategy it is the same (seq scan which is the worst) but the result is cached so it was faster. You need to re thinking about it
A little late, but does anyone know how can i implement something like the initial example, that searches a bunch of keywords? The behavior I want is to get every result that matches at least one of the keywords, but ordered by number of matches (and if possible, still considering the given weights for the fields, as a match in the title is still more valuable than a match in the description)
PostgreSQL is database that uses tables while Elasticsearch uses JSON. The latter is focused on search queries and so it's faster. In my opinion, it is geared towards enterprise stuff.
Awesome video ! The issue that it won't work for "isl" but well "islands" because it's an English word variation is really annoying when searching for names: searching an artist "Martin" won't match "Martina". If anyone has a pointer about a way to achieve that, I'm interested.
There is a rather big mistake in the search query at around 17:00. You used english stemming for creating the vector but not in the search query. Problem is that for example the word 'Training' will get stemmed to 'train' but now if a user searches for 'training' the search won't find any results because they do not match. You have to use 'english' stemming also in the query like this: document_with_weights @@ plainto_tsquery('english', :query)"
First thank you for this great video! But I'm still wondering how it works to search not just for one word. I want to search with more words as one coherent term, so that you compare for example the search term "highway robber battlefield" with the data in your data base. Does anyone have a solution for this?
I did an issue in the typeorm GitHub, it is about how to do an fulltext query with MySQL and typeorm github.com/typeorm/typeorm/issues/3191 I don't know if it is better than what you did, but I want to know your thoughts about it :)
Can you use Synonym search with PostgreSql or Elasticsearch on next video? Here an example. medium.com/@lucasmagnum/elasticsearch-setting-up-a-synonyms-search-facea907ef92