mysql:后缀搜索的有效方式(如';%text';又名前缀通配符)?
MySQL中是否有任何内置功能可以在不扫描整个表的情况下执行上述操作 我找到的唯一解决方案是存储要比较的列的镜像版本,并执行类似“txet%”的mysql:后缀搜索的有效方式(如';%text';又名前缀通配符)?,mysql,wildcard,Mysql,Wildcard,MySQL中是否有任何内置功能可以在不扫描整个表的情况下执行上述操作 我找到的唯一解决方案是存储要比较的列的镜像版本,并执行类似“txet%”的 我也看不到绕过后缀搜索的方法。这是一本德语词典。许多单词都有一个带有前缀的版本,例如用户搜索“Gericht”(Engl.curt),但知道有一个单词“Amtsgericht”(Engl.district curt)也很有价值。不幸的是,在德语中,单词的两个部分通常没有空格分隔。大约15%的查询实际使用前缀搜索。MySQL不会在值以通配符开头时使用索引
我也看不到绕过后缀搜索的方法。这是一本德语词典。许多单词都有一个带有前缀的版本,例如用户搜索“Gericht”(Engl.curt),但知道有一个单词“Amtsgericht”(Engl.district curt)也很有价值。不幸的是,在德语中,单词的两个部分通常没有空格分隔。大约15%的查询实际使用前缀搜索。MySQL不会在值以通配符开头时使用索引 以相反顺序存储第二列是一种防御方法。不过,它在后缀上会失败
如果您知道复合词,您可以预先计算“有价值的知道”匹配,并将它们存储在另一个表中。我认为这不太可能适用于德语词典,但你可能知道一些我不知道的事情。反向字段上的索引将是解决方案,有些人认为:
create index idx_reverse on table ( reverse( field ) );
select * from table where reverse(field) like 'txet%';
但是MySQL不在表达式上使用索引,只在列上使用索引:
这是:
这是:
一个变通方法可以是创建索引的第二个字段(字段->dleif)和一个保留反向字段:
alter table my_table add column dleif ...;
create index idx_reverse on my_table ( dleif );
Create Trigger `reverse_field` Before Update on `my_table` for each row BEGIN
set new.dleif = reverse( new.field );
END;
select * from table where dleif like reverse('%text');
请查看mysql sphinx引擎或ApacheSolr感谢对sphinx的提示!这可以解决我面临的一些其他挑战,例如堵塞。对于这篇文章的问题,我将使用其他答案证实的反列方法。这将是最快的解决方案,也是依赖性最小的解决方案。谢谢你用复合词表达的想法。我认为这对于中缀搜索(如“%text%”)很有用。但由于我在做前缀或后缀,而不是中缀,所以我将使用反列方法。此外,尽管我是德国人,但首先需要对语法进行一些研究,我怀疑,用德语构建复合词的可能性是无穷的,因此需要大量的数据。我以前住在德国。我的印象是,你可以用任何“n”个德语单词组成一个有效的复合词。“n”没有上限。是的,这是真的。一个典型的例子:Donaudampfschifffahrtsgesellschaft。它由五个名词组成:多瑙、丹夫、希夫、法赫特和格塞尔沙夫特……:)
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ]
( { column | ( expression ) } [ opclass ] [, ...] )
...
alter table my_table add column dleif ...;
create index idx_reverse on my_table ( dleif );
Create Trigger `reverse_field` Before Update on `my_table` for each row BEGIN
set new.dleif = reverse( new.field );
END;
select * from table where dleif like reverse('%text');