在我的查询中,我想找到与许多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”列不能转换为不同类型的字符[]