Postgresql ILIKE与TSEARCH

时间:2012-08-25 23:56:06

标签: postgresql full-text-search full-text-indexing

我有一个包含许多测试字段的查询:

SELECT * FROM some-table
  WHERE field1 ILIKE "%thing%"
     OR field2 ILIKE "%thing"
     OR field3 ILIKE "%thing";

列几乎都是varchar(50)或左右。现在我理解提高性能我应该索引搜索操作的字段。我应该考虑完全用TSEARCH替换ILIKE吗?

3 个答案:

答案 0 :(得分:15)

全文搜索设置与“包含”类似查询不同。它源于单词等,所以你可以将“汽车”与“汽车”相匹配。

如果你真的想要一个快速的ILIKE,那么没有标准的数据库索引或FTS会有所帮助。幸运的是,pg_trgm模块可以做到这一点。

答案 1 :(得分:5)

有一点非常重要:没有B-BREE INDEX 会改进这种搜索:

where field ilike '%SOMETHING%'

我所说的是,如果你这样做:

create index idx_name on some_table(field);

您将改进的唯一权限是where field like 'something%'。 (当您搜索以某些文字开头的值时)。因此,在这种情况下,通过向field列添加常规索引,您将无法获益。

如果您需要改善搜索响应时间,请务必考虑使用全文搜索

答案 2 :(得分:3)

在其他人所说的内容中添加一点。

首先,您无法真正使用基于字符串中间值的索引。索引通常是树搜索,您无法知道您的搜索是否比仅扫描表更快,因此PostgreSQL将默认为seq扫描。仅当索引与字符串的 first 部分匹配时才会使用索引。所以:

SELECT * FROM invoice
  WHERE invoice_number like 'INV-2012-435%'

可以使用索引但like '%44354456%'不能。

一般情况下,在LedgerSMB中我们使用两者,具体取决于我们正在进行的搜索类型。您可能会看到如下搜索:

select * from parts
  WHERE partnumber ilike ?  || '%'
    and plainto_tsquery(get_default_language(), ?) @@ description;

所以这些是非常不同的。在最有意义的地方使用每一个。