Questions tagged «pattern-matching»


3
LIKE如何实施?
谁能解释一下LIKE运算符如何在当前数据库系统(例如MySQL或Postgres)中实现?还是让我参考一些解释它的参考文献? 天真的方法是检查每条记录,在感兴趣的字段上执行正则表达式或部分字符串匹配,但是我有一种感觉(希望),这些系统做得更聪明。

2
如何创建索引以加快对表达式的聚合LIKE查询?
我可能在标题中提出了错误的问题。这是事实: 我的客户服务人员一直抱怨在基于Django的站点的管理界面上进行客户查找时响应速度慢。 我们正在使用Postgres 8.4.6。我开始记录慢速查询,并发现了这个罪魁祸首: SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%') 此查询最多需要32秒才能运行。这是EXPLAIN提供的查询计划: QUERY PLAN Aggregate (cost=205171.71..205171.72 rows=1 width=0) -> Seq Scan on auth_user (cost=0.00..205166.46 rows=2096 width=0) Filter: (upper((email)::text) ~~ '%DEYK%'::text) 因为这是由Django ORM从Django Admin应用程序生成的Django QuerySet中生成的查询,所以我对该查询本身没有任何控制权。索引似乎是合理的解决方案。我尝试创建索引来加快速度,但是并没有什么不同: CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text)) 我究竟做错了什么?如何加快查询速度?

1
为什么要在文本列上索引text_pattern_ops?
今天,《七周》中的七个数据库向我介绍了每个操作员的索引。 您可以通过创建text_pattern_ops运算符类别索引来为模式与先前查询匹配的字符串建立索引,只要这些值以小写形式索引即可。 CREATE INDEX moves_title_pattern ON movies ( (lower(title) text_pattern_ops); 我们使用了,text_pattern_ops因为标题是文本类型。如果需要指数VARCHAR处理,字符,或名称,使用相关的OPS: ,varchar_pattern_ops,bpchar_pattern_ops和name_pattern_ops。 我发现该示例确实令人困惑。为什么这样做有用? 如果列是文本类型,在用作搜索值之前,是否会将其他类型(varchar,char,name)强制转换为文本? 该索引的行为与使用默认运算符的索引有何不同? CREATE INDEX moves_title_pattern ON movies (lower(title));

2
Trigram搜索随着搜索字符串变长而变慢
在Postgres 9.1数据库中,我有一个table1约150万行和一列的表label(为方便起见,使用简化名称)。 上有一个功能性trigram-index lower(unaccent(label))(unaccent()已使其不可变,以允许在索引中使用)。 以下查询非常快: SELECT count(*) FROM table1 WHERE (lower(unaccent(label)) like lower(unaccent('%someword%'))); count ------- 1 (1 row) Time: 394,295 ms 但是以下查询速度较慢: SELECT count(*) FROM table1 WHERE (lower(unaccent(label)) like lower(unaccent('%someword and some more%'))); count ------- 1 (1 row) Time: 1405,749 ms 即使搜索更加严格,添加更多单词的速度甚至会更慢。 我尝试了一个简单的技巧,即先对第一个单词运行子查询,然后对完整的搜索字符串进行查询,但是(不幸的是)查询计划者看到了我的想法: EXPLAIN ANALYZE SELECT * FROM ( SELECT …

1
从GIN索引的TSVECTOR列获取部分匹配
我想通过查询获得结果: SELECT * FROM ( SELECT id, subject FROM mailboxes WHERE tsv @@ plainto_tsquery('avail') ) AS t1 ORDER by id DESC; 这可以正常工作并返回tsv包含的行Available。但是,如果我使用avai(放置lable),它什么也找不到。 所有查询都必须在字典中吗?我们不能只查询这些字母吗?我有一个包含电子邮件正文(内容)的数据库,我希望它随着每秒的增长而快速发展。目前我正在使用 ... WHERE content ~* 'letters`

2
查找最长前缀的算法
我有两张桌子。 第一个是带有前缀的表 code name price 343 ek1 10 3435 nt 4 3432 ek2 2 其次是带有电话号码的通话记录 number time 834353212 10 834321242 20 834312345 30 我需要编写一个脚本,该脚本从每个记录的前缀中找到最长的前缀,并将所有这些数据写入第三张表,如下所示: number code .... 834353212 3435 834321242 3432 834312345 343 对于数字834353212,我们必须修剪“ 8”,然后从前缀表3435中找到最长的代码。 我们必须始终删除第一个“ 8”,并且前缀必须在开头。 我很久以前用非常糟糕的方式解决了这个任务。这是可怕的perl脚本,它对每个记录进行很多查询。该脚本: 从调用表中获取一个数字,在循环中从length(number)到1 => $ prefix做子字符串 进行查询:从前缀中选择count(*),例如“ $ prefix”之类的代码 如果count> 0,则使用第一个前缀并写入表 第一个问题是查询计数-是call_records * length(number)。第二个问题是LIKE表达式。恐怕这些很慢。 …

5
使用“ []”通配符将一个](右方括号)与PATINDEX匹配
我正在T-SQL †中编写自定义JSON解析器。 出于解析器的目的,我使用的PATINDEX功能是从标记列表中计算标记的位置。在我的情况下,标记都是单个字符,它们包括以下这些: {} []:, 通常,当我需要找到几个给定字符中任何一个的(第一个)位置时,我会使用如下PATINDEX函数: PATINDEX('%[abc]%', SourceString) 然后,该函数将为我提供aor b或or 的第一个位置c-两者中最先找到的那个SourceString。 现在,就我而言,问题似乎与]角色有关。一旦在字符列表中指定了它,例如: PATINDEX('%[[]{}:,]%', SourceString) 我的预期模式显然已损坏,因为该函数从未找到匹配项。看来我需要一种方法来转义第一个,]以便PATINDEX将其视为查找字符之一,而不是特殊符号。 我发现这个问题询问类似的问题: 需要LIKE运算符和方括号的帮助 但是,在那种情况下,]根本不需要在方括号中指定简单字符,因为它只是一个字符,可以在不带方括号的情况下进行指定。确实使用转义的替代解决方案仅针对LIKE而不适用PATINDEX,因为它使用了ESCAPE由前者而非后者支持的子句。 所以,我的问题是,有没有什么办法去寻找一个]与PATINDEX使用[ ]通配符?还是有一种方法可以使用其他Transact-SQL工具来模拟该功能? 附加信息 这是我需要PATINDEX与上述[…]模式一起使用的查询示例。这里的模式有效(尽管有点),因为它不包含]字符。我也需要使用它]: WITH data AS (SELECT CAST('{"f1":["v1","v2"],"f2":"v3"}' AS varchar(max)) AS ResponseJSON), parser AS ( SELECT Level = 1, OpenClose = 1, P = p.P, S = SUBSTRING(d.ResponseJSON, 1, NULLIF(p.P, 0) …

7
如何在定界符之后生成所有尾随子字符串?
给定一个可能包含定界符的多个实例的字符串,我想生成该字符之后的所有子字符串。 例如,给定一个类似'a.b.c.d.e'(或array {a,b,c,d,e})的字符串,我想生成一个类似以下的数组: {a.b.c.d.e, b.c.d.e, c.d.e, d.e, e} 预期的用法是触发填充一列,以便每当写入另一列时都q.x.t.com可以更轻松地查询域名部分(即查找所有要查询的内容t.com)。 解决这个问题似乎很尴尬(也许很好),但是现在我很好奇如何用(Postgres')SQL编写这样的函数。 这些是电子邮件域名,因此很难说出元素的最大数量是多少,但是可以肯定的是绝大多数元素都小于5。

1
相似度函数的最佳索引
因此,我的这张表有620万条记录,而且我必须对该列执行相似的搜索查询。查询可以是: SELECT "lca_test".* FROM "lca_test" WHERE (similarity(job_title, 'sales executive') > 0.6) AND worksite_city = 'los angeles' ORDER BY salary ASC LIMIT 50 OFFSET 0 可以在where中添加更多条件(年份= X,worksite_state = N,status =“已认证”,visa_class = Z)。 运行其中一些查询可能会花费很长时间,超过30秒。有时超过一分钟。 EXPLAIN ANALYZE 前面提到的查询给了我这个: Limit (cost=0.43..42523.04 rows=50 width=254) (actual time=9070.268..33487.734 rows=2 loops=1) -> Index Scan using index_lca_test_on_salary on lca_test …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.