关于LIKE查询数据库中特定表的响应时间,我看到了相当大的变化.有时我会在200-400毫秒内得到结果(非常可接受),但有时候返回结果可能需要30秒.
我知道LIKE查询是非常耗费资源的,但我只是不明白为什么响应时间会有这么大的差异.我已经在该owner1字段上构建了一个btree索引,但我认为这对LIKE查询没有帮助.有人有主意吗?
示例SQL:
SELECT gid, owner1 FORM parcels
WHERE owner1 ILIKE '%someones name%' LIMIT 10
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('%someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)
和:
SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)
有类似的结果.
表行数:约95,000.
postgresql indexing query-optimization pattern-matching sql-like
为了放弃阅读整个问题,我的基本问题是:
PostgreSQL中是否有一个函数来转义字符串中的正则表达式字符?
我已经探测过文档,但无法找到这样的功能.
这是完整的问题:
在PostgreSQL数据库中,我有一个包含唯一名称的列.我还有一个定期在此字段中插入名称的进程,并且为了防止重复,如果需要输入已存在的名称,它会在末尾附加一个空格和括号.
即姓名,姓名(1),姓名(2),姓名(3)等
就目前而言,我使用以下代码来查找要在系列中添加的下一个数字(用plpgsql编写):
var_name_id := 1;
SELECT CAST(substring(a.name from E'\\((\\d+)\\)$') AS int)
INTO var_last_name_id
FROM my_table.names a
WHERE a.name LIKE var_name || ' (%)'
ORDER BY CAST(substring(a.name from E'\\((\\d+)\\)$') AS int) DESC
LIMIT 1;
IF var_last_name_id IS NOT NULL THEN
var_name_id = var_last_name_id + 1;
END IF;
var_new_name := var_name || ' (' || var_name_id || ')';
Run Code Online (Sandbox Code Playgroud)
(var_name包含我试图插入的名称.)
这暂时有效,但问题出在WHERE声明中:
WHERE a.name LIKE var_name || ' (%)'
Run Code Online (Sandbox Code Playgroud)
此检查不会验证有%问题的数字,并且它不会考虑多个括号,如"Name((1))",如果存在任何一种情况,则会抛出强制转换异常.
该WHERE声明确实需要像更多的东西: …
我们假设我们有一个人员表(姓名,姓名,地址,SSN等).
我们想要找到与指定人A"非常相似"的所有行.我想实现某种模糊逻辑比较A和表People中的所有行.将有几个模糊推理规则分别在几个列上工作(例如3个名称的模糊规则,2个姓氏规则,5个地址规则)
问题是以下哪两种方法会更好,为什么?
将所有模糊规则实现为存储过程,并使用一个重的SELECT语句返回与A"非常相似"的所有行.此方法可能包括使用soundex,sim metric等.
实现一个或多个更简单的SELECT语句,返回不太准确的结果,"与A非常相似",然后将A与所有返回的行(数据库外部)进行模糊比较,以获得"非常相似"的行.因此,模糊的比较将在我最喜欢的编程语言中实现.
表人们应该有多达500k行,我想每天制作大约500-1000个这样的查询.我使用MySQL(但这还有待考虑).
在 PSQL(我相信 Redshift 基于它)中,有像levenshtein/ levenshtein_less_equal[ http://www.postgresql.org/docs/9.1/static/fuzzystrmatch.html ]这样的字符串相似度函数。这些功能似乎没有进入 Redshift [ http://docs.aws.amazon.com/redshift/latest/dg/String_functions_header.html ]。我错了,还是有人提出了创造性的查询来解决此限制?
我正在尝试使用Postgres创建一个模糊搜索,并一直使用django-watson作为基础搜索引擎来解决问题.
我有一个名为search_tsv的字段,它是一个包含我要搜索的模型的所有字段值的tsvector.
我想要使用Levenshtein函数,它在文本字段中完全符合我的要求.但是,我真的不知道如何在tsvector的每个元素上运行它.
有没有办法做到这一点?
postgresql ×4
escaping ×1
fuzzy-logic ×1
fuzzy-search ×1
indexing ×1
mysql ×1
plpgsql ×1
regex ×1
select ×1
sql ×1
sql-like ×1
tsvector ×1