官术网_书友最值得收藏!

  • Mastering PostgreSQL 10
  • Hans Jürgen Sch?nig
  • 263字
  • 2021-06-30 19:04:00

Defining GIN indexes

If you want to apply text search to a column or a group of columns, there are basically two choices:

  • Create a functional index using GIN
  • Add a column containing ready-to-use tsvectors and a trigger to keep them in sync

In this section, both options will be outlined. To show how things work, I have created some sample data:

test=# CREATE TABLE t_fts AS SELECT comment 
FROM pg_available_extensions;
SELECT 43

Indexing the column directly with a functional index is definitely a slower but more space efficient way to get things done:

test=# CREATE INDEX idx_fts_func ON t_fts 
USING gin(to_tsvector('english', comment)); CREATE INDEX

Deploying an index on the function is easy, but it can lead to some overhead. Adding a materialized column needs more space, but will lead to a better runtime behavior:

test=# ALTER TABLE t_fts ADD COLUMN ts tsvector; 
ALTER TABLE 

The only trouble is, how do you keep this column in sync? The answer is by using a trigger:

test=# CREATE TRIGGER tsvectorupdate 
BEFORE INSERT OR UPDATE ON t_fts
FOR EACH ROW
EXECUTE PROCEDURE
tsvector_update_trigger(somename, 'pg_catalog.english', 'comment');

Fortunately, PostgreSQL already provides a C function that can be used by a trigger to sync the tsvector column. Just pass a name, the desired language, as well as a couple of columns to the function, and you are already done. The trigger function will take care of all that is needed. Note that a trigger will always operate within the same transaction as the statement making the modification. Therefore, there is no risk of being inconsistent.

主站蜘蛛池模板: 隆昌县| 安阳县| 巴楚县| 天镇县| 东光县| 玛多县| 日土县| 丹棱县| 连云港市| 长兴县| 象州县| 宜黄县| 阳城县| 石棉县| 汨罗市| 海原县| 鱼台县| 耿马| 布拖县| 五原县| 阳山县| 彰化县| 九台市| 琼海市| 嘉义县| 轮台县| 阿图什市| 广宁县| 西充县| 思茅市| 武陟县| 曲靖市| 金秀| 榆树市| 临江市| 锦州市| 正定县| 隆尧县| 文昌市| 江阴市| 卓尼县|