当前位置: 首页 > 面试题库 >

PostgreSQL文本数组子字符串搜索

马阳曦
2023-03-14
问题内容

在我的查询中,我想找到与许多LIKE运算符之一匹配的行。我知道这样做的3种方法,但是只有其中一种可以使用索引。

让我们从表开​​始:

CREATE TABLE dir (
    id BIGSERIAL PRIMARY KEY,
    path TEXT NOT NULL
);

CREATE INDEX path_idx ON dir(path TEXT_pattern_ops);

插入样本数据后,我可以执行以下操作:

EXPLAIN ANALYZE 
SELECT id, path FROM dir
   WHERE path LIKE 'A%'
      OR path LIKE 'B%'
      OR path LIKE 'C%';

以上查询正确使用索引。

第二种方式:

EXPLAIN ANALYZE 
SELECT id, path FROM dir
  WHERE path LIKE ANY(ARRAY['A%', 'B%', 'C%']::TEXT[]);

该查询将不使用索引。我知道的最后一种方法:

CREATE TABLE patterns (pattern) AS VALUES
('A%'),
('B%'),
('C%');

EXPLAIN ANALYZE 
SELECT id, path FROM dir
  JOIN patterns ON (dir.path LIKE patterns.pattern);

与上一个查询类似,该查询将不使用索引。

这是SQL Fiddle,适用于那些想如何使用这些查询的人:http :
//sqlfiddle.com/#!17/24031/2

问题:path LIKE X OR path LIKE Y对于许多模式,使用的查询是完全不可读的(模式数量可能从几到几百甚至几千不等),而且恐怕大型查询的解析速度可能会很慢,甚至无法达到1GB的查询长度限制(某些模式可能有非常长的前缀)。

问题: 是否有oder方法返回相同的结果,而无需将所有模式直接放入查询中(例如在带有join的此选项中)?


问题答案:

您可以创建一个支持您查询的三字母索引。

为此,您需要pg_trgm扩展;以超级用户身份运行以下命令:

CREATE EXTENSION pg_trgm;

然后,您可以创建一个GIN索引:

CREATE INDEX ON dir USING gin (path gin_trgm_ops);

该索引可以与第二种方法和第三种方法一起使用,因此它可以为您解决问题。

使用示例中的简短模式时,索引将不会非常有效。

您还可以使用GiST索引,该索引可能较小,但搜索速度较慢。

请注意,您也可以将该索引用于以开头的模式%



 类似资料:
  • 问题内容: 我正在编写一个PostgreSQL函数,以计算特定文本子字符串在另一段文本中出现的次数。例如,调用count(’foobarbaz’,’ba’)应该返回2。 我了解要测试子字符串是否出现,我使用类似于以下的条件: 但是,我需要它返回“ ba”发生次数的2。我该如何进行? 在此先感谢您的帮助。 问题答案: 选择的答案被证明比改版的慢得多。创建行以及运行聚合的开销实在太高了。 最快的方法如

  • 如果我搜索John,就会得到结果(如果我搜索Jo,就会得到event)。但如果我搜索无名氏,显然没有任何结果。 如果我将查询更改为JohnDoe,我会得到结果,但它会返回所有在其最后/名字中有John或Doe的人。 接下来是尝试使用mongoose TextSearch: 有办法解决吗? 没有外部插件的答案是首选的,但其他的也是希望的。

  • 我正在寻找添加一个简单的搜索字段,希望使用类似的东西 我尝试使用,但它没有返回任何内容。

  • 问题内容: 如何搜索以关键字开头的字符串数组? 例如, 当我的搜索字符串必须显示时 当我的搜索字符串是那么。 问题答案: 交换为您只希望寻找遏制。

  • 问题内容: 程序从经过排序的字符串的txt文件中读取,并使用顺序的,迭代的二进制和递归的二进制存储在数组中,然后在数组中搜索位置以及查找该单词所需的迭代次数。当我尝试将数组中的单词与用户输入的单词进行比较时出现错误。不知道为什么。2)希望有人可以解释迭代二进制和递归二进制之间的区别。3)为什么需要这样做… SearchString si = new SearchString(); 程序在下面… }

  • 下面是一个名为“containers”的表的片段。 如何将“产品”列更改为“字符变化[]”,并将相应的修饰符更改为默认值“{}”::字符变化[]?本质上,我想将字符串转换为字符串数组。注意,“产品”列对字符数没有限制。 抛出以下错误 错误:“products”列不能转换为不同类型的字符[]