Full Text Search PostgreSQL

Ғылым және технология

Learn how to implement full text search in PostgreSQL.
Code: github.com/benawad/postgres-f...
Links from video:
www.postgresql.org/docs/9.5/t...
----
If you like cooking, checkout my side project: www.mysaffronapp.com/
----
Join the Discord: / discord
----
Patreon: / benawad
----
Follow Me Online Here:
Twitch: / benawad
GitHub: github.com/benawad
LinkedIn: / benawad
Instagram: / benawad97
Twitter: / benawad
#benawad
TikTok: / benawad ​

----
Follow me online: voidpet.com/benawad
#benawad

Пікірлер: 127

  • @PreetamBhosle
    @PreetamBhosle5 жыл бұрын

    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'

  • @bawad

    @bawad

    5 жыл бұрын

    Oh awesome

  • @herbertpimentel

    @herbertpimentel

    4 жыл бұрын

    Hey man, you look to understand very well about this... do you have any video to share with us ?

  • @sungatae

    @sungatae

    3 жыл бұрын

    What impact does :* have on performance?

  • @benargee

    @benargee

    3 жыл бұрын

    @@sungatae he explained how to check in the video. Explain analyze.

  • @dedygunanto

    @dedygunanto

    3 жыл бұрын

    what if i want to search 'island' just with 'land', i tried with '*:land' is not working and generate error message?

  • @jayadevanm8386
    @jayadevanm83864 жыл бұрын

    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.

  • @gabriel_export
    @gabriel_export3 жыл бұрын

    So much clearer than the postgresql docs. My head was spinning reading all the technical details of how it works. THANKS

  • @amavumkal
    @amavumkal3 жыл бұрын

    That was very helpful. I love how you started very basic and then got into the complex queries. Thanks so much!

  • @arkadyzelensky7655
    @arkadyzelensky76554 жыл бұрын

    I searched for a full-text search explanation and just clicked on the first video on KZread. And this was such luck! Very clear and interesting explanation. Thank you a lot for doing this!

  • @Pan-ux3bq
    @Pan-ux3bq3 жыл бұрын

    This is the best and the simplest explanation of postgresql FTS I could find on internet

  • @birham07
    @birham072 жыл бұрын

    I like how you followed start simple finish master approach. Thank you for your awesome contents once again!

  • @michaelhearmon9965
    @michaelhearmon99654 жыл бұрын

    I come from a T-SQL background, but codewars use Postgresql. This was really interesting to learn, thanks for the upload

  • @christiangyaban9666
    @christiangyaban96665 жыл бұрын

    Ben...finally my request have been granted...👍u rock

  • @barclaysd
    @barclaysd4 жыл бұрын

    Such a great tutorial! Thanks Ben!

  • @schriker17
    @schriker173 жыл бұрын

    Works great! I've just tested it with 125k rows, and results are close enough so i can omit running elasticksearch like database!

  • @usernamegaro
    @usernamegaro3 жыл бұрын

    i really appreciate your effort for explaining in a simple way this powerful function, thanks a lot! ;)

  • @rubinskyzlatrovich6731
    @rubinskyzlatrovich67315 жыл бұрын

    💪🏻💪🏻 2 of the list ✅. Dude, nice video! Seems like the video will do great! congrats and 🙏🏻thank you

  • @pablo_brianese
    @pablo_brianese3 жыл бұрын

    I didn't expect to find a video from you on this topic. I am lucky!

  • @michaeldausmann6066
    @michaeldausmann60663 жыл бұрын

    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.

  • @dennistennis5622
    @dennistennis56225 жыл бұрын

    Great video again Ben!

  • @eminem2
    @eminem25 жыл бұрын

    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.

  • @bawad

    @bawad

    5 жыл бұрын

    I've been meaning to try out the search module for Redis, that sounds sweet

  • @lakshyarajdash
    @lakshyarajdash Жыл бұрын

    Great explanation.. saved a lot of time that I wasted searching over the internet.

  • @lldadb664
    @lldadb664 Жыл бұрын

    Right to the point with great examples. Thanks!

  • @froylanvargas6902
    @froylanvargas69024 жыл бұрын

    Excellent tutorial here! Thanks.

  • @saeedrezaalipourfard1902
    @saeedrezaalipourfard19024 жыл бұрын

    Great tutorial! Thanks.

  • @MohanChawla-jy2wc
    @MohanChawla-jy2wc6 ай бұрын

    Very clear explanation. Thank You so much!

  • @bmdolan
    @bmdolan4 жыл бұрын

    This is a GREAT tutorial! Thanks.

  • @willcowan7678
    @willcowan76784 жыл бұрын

    Awesome tutorial, thank you

  • @tunedmystic1
    @tunedmystic15 жыл бұрын

    Awesome! Great video Ben! subbed 👍

  • @bawad

    @bawad

    5 жыл бұрын

    Welcome :)

  • @lemonphi
    @lemonphi4 жыл бұрын

    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

  • @bawad

    @bawad

    4 жыл бұрын

    thanks

  • @JacksonWelch
    @JacksonWelch3 жыл бұрын

    Great video, super helpful. Wonder how this would scale with a really large database.

  • @dedygunanto
    @dedygunanto3 жыл бұрын

    Awesome tutorial!!

  • @vichitrakumar4452
    @vichitrakumar44524 жыл бұрын

    Great tutorial!

  • @sethmoeckel6160
    @sethmoeckel6160 Жыл бұрын

    Postgres Generated columns would be really useful for generating search documents as changes are made. Its also a bit simpler than triggers.

  • @stevezelaznik5872

    @stevezelaznik5872

    Жыл бұрын

    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.

  • @LawZist
    @LawZist5 жыл бұрын

    great video!

  • @SeriousM4x
    @SeriousM4x Жыл бұрын

    i was just looking up this topic, clicked on the video and half way though realised its from ben

  • @abelhuaranca4785
    @abelhuaranca47852 жыл бұрын

    EXCELLENT LESSON, PERFECT, SUBLIME, THANKS THANKS BEN AWAD!!!! A HUUUUUUUUUUUUUUUUGE THANKS!!!!! :D

  • @mh5854
    @mh585411 ай бұрын

    use plainto_tsquery instead of to_tsquery, because to_tsquery does not escape the sql letters like ', \, !, so the query can be easily injected

  • @kythinhnguyen5474
    @kythinhnguyen5474 Жыл бұрын

    very usefull, thank you.

  • @sufiyaanrajput7533
    @sufiyaanrajput75334 жыл бұрын

    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?

  • @stevezelaznik5872

    @stevezelaznik5872

    2 жыл бұрын

    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.

  • @antoniosousa4178
    @antoniosousa41782 жыл бұрын

    You are the man.

  • @PeterCulka
    @PeterCulka3 жыл бұрын

    Thanks for this. Now what about accentuated chars? Latin2 etc ?

  • @aufula
    @aufula3 жыл бұрын

    I create a MATERIALIZED VIEW and a combined GIN index on it to prevent adding those additional columns.

  • @ArtemSutulov
    @ArtemSutulov4 жыл бұрын

    Thanks a lot

  • @sanskarkaazi3830
    @sanskarkaazi3830 Жыл бұрын

    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?

  • @sojun2642
    @sojun26424 жыл бұрын

    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

  • @ackava
    @ackava3 жыл бұрын

    Can't you create a computed column for tsvector instead of creating trigger?

  • @leandrogripp1251
    @leandrogripp12512 жыл бұрын

    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)

  • @septinmulatsihrezki2823
    @septinmulatsihrezki28235 жыл бұрын

    nice video

  • @user-rz6jj3ky3e
    @user-rz6jj3ky3e Жыл бұрын

    if we need to use search on 2 tables then how to build an index in this case. pls help

  • @asifhaider5638
    @asifhaider56384 жыл бұрын

    did you use javascript to see the probable result in your website or just prosgres ...if you did..how you do it ...can you help me

  • @eduardmart1237
    @eduardmart12372 жыл бұрын

    How do you add these indexes automatically on insert or update?

  • @DrPanesar
    @DrPanesar5 жыл бұрын

    hi Ben thanks for the video. Is there a way to do a partial match to a word with this type of search setup? So Noo would find Noodles?

  • @bawad

    @bawad

    5 жыл бұрын

    I think so, but I haven't tried to do it myself

  • @vishwas22khare
    @vishwas22khare3 жыл бұрын

    Man how you connect posters full text search with your saffron website please please please tell me .

  • @armaan8350
    @armaan83503 жыл бұрын

    If a table have child table then how a text can be search from parent table as well as child table. Please help me. I stuck in my project

  • @SergiiStarodubtsev
    @SergiiStarodubtsev2 жыл бұрын

    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

  • @TehLostGamers
    @TehLostGamers3 жыл бұрын

    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

  • @rafaelrequenatroncos2771
    @rafaelrequenatroncos27713 жыл бұрын

    Can you do full text with incomplete words?

  • @waterydan
    @waterydan3 жыл бұрын

    Just wondering how I can search across multiple tables? Do I need to concatenate all tables into a new one and do the full text search there?

  • @geralt36

    @geralt36

    3 жыл бұрын

    how about creating a view of all those tables and having a tsvector column of all the required columns in that same view

  • @alex14779
    @alex147795 жыл бұрын

    what about performance when you re-create index on every update?

  • @bawad

    @bawad

    5 жыл бұрын

    no idea

  • @JasonKim1

    @JasonKim1

    5 жыл бұрын

    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.

  • @victorxu9634

    @victorxu9634

    5 жыл бұрын

    you rebuild the GIN/GiST index for that row when the row is updated. More info here www.postgresql.org/docs/9.1/textsearch-indexes.html

  • @alexsantiago2797
    @alexsantiago27973 жыл бұрын

    I love you. Is there anything you haven't covered?

  • @me_sami05
    @me_sami054 жыл бұрын

    Could you please help me to understand the difference between Full Text Search PostgreSQL and Elasticsearch?

  • @neneodonkor

    @neneodonkor

    Жыл бұрын

    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.

  • @merlin2600
    @merlin26005 жыл бұрын

    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.

  • @theacid1

    @theacid1

    Жыл бұрын

    You can add a '':*' in the search query. Example with 'isla': plainto_tsquery('isla:*') will match all words prefixed with 'isla'

  • @jeudesprits440
    @jeudesprits4405 жыл бұрын

    Ben Awad, what u say about FoundationDB?

  • @bawad

    @bawad

    5 жыл бұрын

    never tried it

  • @fenkssoehas4513
    @fenkssoehas45135 жыл бұрын

    Could please tell me what IDE that you've been used? thx

  • @bawad

    @bawad

    5 жыл бұрын

    vscode

  • @cunningham.s_law
    @cunningham.s_law5 жыл бұрын

    can you make videos on elastic search?

  • @bawad

    @bawad

    5 жыл бұрын

    sure

  • @sushilbansalk
    @sushilbansalk5 жыл бұрын

    there is a directive available on Typeorm: @Index({ fulltext: true }) Not sure what it does and how it works.

  • @bawad

    @bawad

    5 жыл бұрын

    I didn't know that existed, I'll have to go check it out

  • @stevereid636

    @stevereid636

    4 жыл бұрын

    Did you ever get round to checking this out?

  • @bawad

    @bawad

    4 жыл бұрын

    Nope, haven't done another project with fulltext search yet

  • @sreevishal2223
    @sreevishal22234 жыл бұрын

    Your awesome (y)..

  • @alooooooola
    @alooooooola3 жыл бұрын

    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

  • @mattgordon9196
    @mattgordon91965 жыл бұрын

    Is this possible utilizing knex?

  • @bawad

    @bawad

    5 жыл бұрын

    yeah this isn't specific to typeorm, just postgres

  • @San_OO7
    @San_OO72 жыл бұрын

    MySQL vs PSQL please

  • @probleemsupport3119
    @probleemsupport31193 жыл бұрын

    wich software do u use there?

  • @dejfcold

    @dejfcold

    2 жыл бұрын

    It's JetBrains' DataGrip for the DB stuff and VS Code for the JS stuff

  • @NexoLP
    @NexoLP4 жыл бұрын

    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?

  • @lemonphi

    @lemonphi

    4 жыл бұрын

    you can use operators like &, | and !

  • @CardinalHijack
    @CardinalHijack4 жыл бұрын

    Hey Ben, do you know how these results compare to using typeorm find or findOne?

  • @bawad

    @bawad

    4 жыл бұрын

    you'll want to use find or findOne first if that supports your use case

  • @CoryMcaboy
    @CoryMcaboy5 жыл бұрын

    What editor of that?

  • @bawad

    @bawad

    5 жыл бұрын

    www.jetbrains.com/datagrip/

  • @danieldosen5260

    @danieldosen5260

    5 жыл бұрын

    I'm a big an of datagrip - just know that you can tweak your sql syntax formatting. I'm not a big fan of their default editor formatting rules.

  • @bawad

    @bawad

    5 жыл бұрын

    oh cool

  • @maximsobolevskiy5595

    @maximsobolevskiy5595

    5 жыл бұрын

    @@danieldosen5260 But can you configure the style you need? If not, please, file a feature request in our tracker: youtrack.jetbrains.com/issues/DBE

  • @WernerRaath
    @WernerRaath4 жыл бұрын

    I would definitely recommend this video, which builds on what you've said: kzread.info/dash/bejne/lWx91LeBhpqWe7Q.html

  • @pajeetsingh
    @pajeetsingh3 жыл бұрын

    You did not consider time to create a new column.

  • @tim.bogdanov

    @tim.bogdanov

    Жыл бұрын

    Exactly what im facing right now. I assume you mean adding more columns down the road to search on right?

  • @sharam1337
    @sharam13375 жыл бұрын

    every recipe is from julie right now.

  • @bawad

    @bawad

    5 жыл бұрын

    In the video that's Julie's account Or your looking at the sample cookbook which she made

  • @vieto4847
    @vieto48474 жыл бұрын

    thank u for this video ! But i want to get all records in table and still use *doc..* @@ plainto_tsquery(:query) . So what do i put in "query" ?

  • @bawad

    @bawad

    4 жыл бұрын

    Why do you need to use tsquery if you want all the records?

  • @obedm503
    @obedm5035 жыл бұрын

    would be cool if you made a similar video but using pg_trgm instead of vectors also sent a twitter dm about this

  • @andresmontoya7852
    @andresmontoya78525 жыл бұрын

    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 :)

  • @bawad

    @bawad

    5 жыл бұрын

    I've never tried to do that with MySQL so I'm not sure how it compares

  • @andresmontoya7852

    @andresmontoya7852

    5 жыл бұрын

    @@bawad you can run it over docker and try it

  • @paraavcs2125
    @paraavcs21255 жыл бұрын

    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

  • @kerodfresenbetgebremedhin1881
    @kerodfresenbetgebremedhin18812 жыл бұрын

    trigrams

  • @japroz
    @japroz3 жыл бұрын

    Hhhiiiii

  • @theacid1
    @theacid1 Жыл бұрын

    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)"

  • @Spongeoel
    @Spongeoel3 жыл бұрын

    great video!!

Келесі