瀏覽代碼

Speed up fulltext search via indexing

master
Dylan Baker 4 年之前
父節點
當前提交
6571eab680
共有 1 個文件被更改,包括 20 次插入3 次删除
  1. 20
    3
      db/migrate.rb

+ 20
- 3
db/migrate.rb 查看文件

4
 
4
 
5
 def migrate
5
 def migrate
6
   db = connect
6
   db = connect
7
-  db.create_table :threads do
7
+  db.create_table? :threads do
8
     primary_key :id
8
     primary_key :id
9
     String :title
9
     String :title
10
     String :creator, index: true
10
     String :creator, index: true
14
     DateTime :created_at, index: true
14
     DateTime :created_at, index: true
15
   end
15
   end
16
 
16
 
17
-  db.create_table :posts do
17
+  db.create_table? :posts do
18
     primary_key :id
18
     primary_key :id
19
     String :body
19
     String :body
20
     String :creator, index: true
20
     String :creator, index: true
21
     Integer :remote_id, index: true, unique: true
21
     Integer :remote_id, index: true, unique: true
22
     foreign_key :thread_id, :threads
22
     foreign_key :thread_id, :threads
23
     DateTime :created_at, index: true
23
     DateTime :created_at, index: true
24
+    column :tsv, 'tsvector'
24
   end
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
     BEGIN
30
     BEGIN
28
       UPDATE threads
31
       UPDATE threads
29
       SET
32
       SET
35
     END
38
     END
36
   SQL
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
   db.run(<<-SQL)
48
   db.run(<<-SQL)
39
     CREATE TRIGGER update_last_post
49
     CREATE TRIGGER update_last_post
40
     AFTER INSERT ON posts
50
     AFTER INSERT ON posts
41
     FOR EACH ROW
51
     FOR EACH ROW
42
     EXECUTE PROCEDURE update_last_post();
52
     EXECUTE PROCEDURE update_last_post();
43
   SQL
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
 end
61
 end

Loading…
取消
儲存