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

如何使用许多LIKE运算符并使用索引

皇甫文乐
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索引,该索引可能较小,但搜索速度较慢。

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



 类似资料:
  • 问题内容: 通配符*只能在单词的末尾使用,例如。 我想用like查询,该怎么做? 问题答案: Lucene提供了ReverseStringFilter,它允许执行通配符搜索,例如* user。它通过以相反顺序索引所有术语来工作。 但是我认为没有办法做类似’LIKE%user%’的事情。

  • 问题内容: 设置以下映射 通知ID是一个整数。现在我需要使用like运算符进行此HQL查询 ATT:它 就像 运算符NOT = (等于运算符) 然后我用 但是不起作用,因为Hibernate抱怨在调用User.id的getter时发生了IllegalArgumentException 即使我使用 这没用 我应该使用什么来传递查询? 问题答案: 根据Hibernate参考: str()用于将数字或时

  • 这很有魅力: 但如果我想按多个单词搜索,它将不返回任何内容,例如: 当我使用CURL时,我通过将添加到我的JSON属性来解决这个问题: 卷曲-XGET“http://localhost:9200/_search“-d”{“查询”:{“匹配”:{“字段”:{“查询”:“word\u 1 word\u 2”,““模糊性”:“自动”,““运算符”:“和”}}}}}” 我如何在Java中实现这一点?

  • 如何编写python代码以删除某些值?例如。我想在数据帧列中删除一个极值。我尝试在删除失败之前先选择。 数据[['代谢率'] 在1 #您的答案中键入错误追溯(最近呼叫)-- 类型错误:'

  • 问题内容: 在我的Hibernate JPA示例代码中。 给整个字符串时它工作正常 但是,当我们赋予ie 或 其实我的想法是我给运算符,使它可以工作给定字符串的任何字符。 问题答案: 您正在使用 代替 第一个将返回 等的行。

  • 模板输出进可以使用几个运算符: 加法: {$a+$b} 减法: {$a-$b} 乘法: {$a \* $b} 除法: {$a/$b} 取余: {$a%$b} ++: {$a++} {++$a} --: {$a--} {--$a} 综合运算: {$a+$b+$c*$d}