我以前从未使用过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的正确用法是什么?我可以在一张桌子上应用全文搜索吗?
答案 0 :(得分:1)
您需要为要查询的内容编制索引。 tsvector无法帮助您进行like
搜索。既然这是一个前缀,那么标准的btree就可以了。如果你想进行中缀搜索(where mycol like '%something%'
),你需要使用pg_trgm扩展并制作一个三元组GIN索引。
密切注意to_tsvector返回的内容,并注意您正在编制索引的内容。您索引的内容并不能为您提供任何查询。