关于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
在Microsoft SQL Server中,可以指定"重音不敏感"排序规则(对于数据库,表或列),这意味着可以进行类似的查询
SELECT * FROM users WHERE name LIKE 'João'
Run Code Online (Sandbox Code Playgroud)
找到一个带有Joao名字的行.
我知道可以使用unaccent_string contrib函数从PostgreSQL中删除字符串中的重音符号,但我想知道PostgreSQL是否支持这些"重音不敏感"排序规则,以便SELECT上述方法可行.
如果rake命令db:create可以跟随postgresql安装脚本,那将是可爱的.例如,这.(必须以postgres用户身份运行):
CREATE EXTENSION "fuzzystrmatch";
Run Code Online (Sandbox Code Playgroud)
这是因为,在这一刻,我每次创建数据库时都会手动执行此操作.
任何提示?
有一个非常类似的问题.其中一个解决方案使用如下代码:
string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s
Run Code Online (Sandbox Code Playgroud)
这会产生奇迹,直到你注意到它还会移除空格,圆点,破折号以及谁知道还有什么.
我不是很确定第一个代码是如何工作的,但它是否可以仅剥离重音符号?或至少给出一个保留的字符列表?我对regexps的了解很少,但我尝试过(无济于事):
/[^\-x00-\x7F]/n # So it would leave the dash alone
Run Code Online (Sandbox Code Playgroud)
我要做这样的事情:
string.mb_chars.normalize(:kd).gsub('-', '__DASH__').gsub
(/[^x00-\x7F]/n, '').gsub('__DASH__', '-').to_s
Run Code Online (Sandbox Code Playgroud)
残暴?是...
我也尝试过:
iconv = Iconv.new('UTF-8', 'US-ASCII//TRANSLIT') # Also tried ISO-8859-1
iconv.iconv 'Café' # Throws an error: Iconv::IllegalSequence: "é"
Run Code Online (Sandbox Code Playgroud)
请帮忙?
我有一个使用PostgreSQL 9.X和JPA2(Hibernate实现)的Java EE项目.如何强制类似查询不区分大小写并且不区分重音?
我能够更改数据库的字符集,因为它是第一个使用它的项目.
postgresql ×4
indexing ×2
diacritics ×1
java-ee ×1
jpa-2.0 ×1
localization ×1
ruby ×1
sql ×1
sql-like ×1
string ×1