Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我想搜索2个字符,有什么解决方案吗?(三元索引仅适用于至少3个字符)_Ruby On Rails_Postgresql_Performance - Fatal编程技术网

Ruby on rails 我想搜索2个字符,有什么解决方案吗?(三元索引仅适用于至少3个字符)

Ruby on rails 我想搜索2个字符,有什么解决方案吗?(三元索引仅适用于至少3个字符),ruby-on-rails,postgresql,performance,Ruby On Rails,Postgresql,Performance,我在名字和姓氏列上有一个三元索引,我想搜索2个字符。我尝试在打开或关闭顺序扫描的情况下执行查询,并测量每种情况下需要多长时间,但这两种情况下都需要大量时间。有没有解决方案可以让我的2个字符搜索更快 在模式中,我有: t、 索引“(((名字)::text | |“”:text)| |(姓氏)::text)) gin\u trgm\u ops”,名称:“索引用户\u全名”,使用::gin 我不认为有什么内在的东西可以做到这一点。您可以创建一个函数,将文本转换为bigram数组(决定如何处理空格、标点

我在名字和姓氏列上有一个三元索引,我想搜索2个字符。我尝试在打开或关闭顺序扫描的情况下执行查询,并测量每种情况下需要多长时间,但这两种情况下都需要大量时间。有没有解决方案可以让我的2个字符搜索更快

在模式中,我有:

t、 索引“(((名字)::text | |“”:text)| |(姓氏)::text)) gin\u trgm\u ops”,名称:“索引用户\u全名”,使用::gin


我不认为有什么内在的东西可以做到这一点。您可以创建一个函数,将文本转换为bigram数组(决定如何处理空格、标点符号、非ASCII码等),然后对该数组进行索引,并使用
&&
运算符进行查询。但是,除非您的两个字符类似于'qz',否则您可能无法获得足够的选择性,从而使索引具有价值

create function bigram(text) returns text[] language sql as $$
    select array_agg(substring($1,x,2)) from generate_series(1,length($1)-1) f(x);
$$ immutable;

create index on foobar using gin (bigram(t));
select * from foobar where bigram(t) && bigram('aa');

顾名思义,三元图是3个连续字符。你想从2个字符开始,因为很明显,潜在的结果非常复杂。我的问题是:我应该使用什么索引来帮助我搜索2个字符?