如何在postgresql中使用gin索引

时间:2017-01-04 12:51:47

标签: database postgresql indexing

我以前从未使用过GIN索引,而我正试图了解它是如何工作的。 我有一个包含4百万行的静态表,我需要使用WHERE子句运行SELECT查询。

现在我的表在列上有一个B-Tree索引" name"在where子句中使用。

我已经读过使用GIN索引进行全文搜索可以大大提高速度。我已经阅读了教程here,现在我不确定当我只有一个表时,这是否可以使用。

如果我们要加入多个表,全文搜索是否有效?

我知道GIN索引适用于tsvector列。这就是我到目前为止所做的事情:

我更改了我的表并添加了一个列:tsv:

final AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity()).setMessage("Please wait you are being redirected");

                final AlertDialog alert = dialog.create();

                alert.show();
                alert.setCancelable(false);

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run()
                    {
                        Intent i = new Intent(ctx, MyAccount.class);
                        startActivity(i);
                        if (alert.isShowing()) {
                            alert.dismiss();
                        }
                    }
                }, 3000);

我在ts_vector列上创建了一个GIN索引:

ALTER TABLE my_table ADD COLUMN tsv tsvector;

我已更新专栏:

CREATE INDEX tsv_idx ON my_table USING gin(to_tsvector('english', name));

以上是否正确?所以现在如果我想运行以下查询:

UPDATE my_table SET tsv = to_tsvector(name)

如何使用GIN索引进行操作?

我试过了:

SELECT clm1, clmn2 FROM my_table WHERE name LIKE 'Ath%' ORDER BY 1

但是我收到了一个错误:

SELECT clm1, clmn2 FROM my_table WHERE tvs LIKE 'Ath%' ORDER BY 1

我在这里缺少什么? GIN的正确用法是什么?我可以在一张桌子上应用全文搜索吗?

1 个答案:

答案 0 :(得分:1)

您需要为要查询的内容编制索引。 tsvector无法帮助您进行like搜索。既然这是一个前缀,那么标准的btree就可以了。如果你想进行中缀搜索(where mycol like '%something%'),你需要使用pg_trgm扩展并制作一个三元组GIN索引。

密切注意to_tsvector返回的内容,并注意您正在编制索引的内容。您索引的内容并不能为您提供任何查询。