Browse Source

Speed up fulltext search via indexing

master
Dylan Baker 4 years ago
parent
commit
6571eab680
1 changed files with 20 additions and 3 deletions
  1. 20
    3
      db/migrate.rb

+ 20
- 3
db/migrate.rb View File

@@ -4,7 +4,7 @@ require_relative 'connect'
4 4
 
5 5
 def migrate
6 6
   db = connect
7
-  db.create_table :threads do
7
+  db.create_table? :threads do
8 8
     primary_key :id
9 9
     String :title
10 10
     String :creator, index: true
@@ -14,16 +14,19 @@ def migrate
14 14
     DateTime :created_at, index: true
15 15
   end
16 16
 
17
-  db.create_table :posts do
17
+  db.create_table? :posts do
18 18
     primary_key :id
19 19
     String :body
20 20
     String :creator, index: true
21 21
     Integer :remote_id, index: true, unique: true
22 22
     foreign_key :thread_id, :threads
23 23
     DateTime :created_at, index: true
24
+    column :tsv, 'tsvector'
24 25
   end
25 26
 
26
-  db.create_function(:update_last_post, <<-SQL, language: :plpgsql, returns: :trigger)
27
+  db.run('CREATE INDEX tsv_idx ON posts USING gin(tsv);')
28
+
29
+  db.create_function?(:update_last_post, <<-SQL, language: :plpgsql, returns: :trigger)
27 30
     BEGIN
28 31
       UPDATE threads
29 32
       SET
@@ -35,10 +38,24 @@ def migrate
35 38
     END
36 39
   SQL
37 40
 
41
+  db.create_function?(:set_posts_tsv, <<-SQL, language: :plpgsql, returns: :trigger)
42
+    BEGIN
43
+      NEW.tsv = to_tsvector(new.body);
44
+      RETURN NEW;
45
+    END
46
+  SQL
47
+
38 48
   db.run(<<-SQL)
39 49
     CREATE TRIGGER update_last_post
40 50
     AFTER INSERT ON posts
41 51
     FOR EACH ROW
42 52
     EXECUTE PROCEDURE update_last_post();
43 53
   SQL
54
+
55
+  db.run(<<-SQL)
56
+    CREATE TRIGGER set_posts_tsv
57
+    BEFORE INSERT OR UPDATE ON posts
58
+    FOR EACH ROW
59
+    EXECUTE PROCEDURE set_posts_tsv();
60
+  SQL
44 61
 end

Loading…
Cancel
Save