Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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
mysql:后缀搜索的有效方式(如';%text';又名前缀通配符)?_Mysql_Wildcard - Fatal编程技术网

mysql:后缀搜索的有效方式(如';%text';又名前缀通配符)?

mysql:后缀搜索的有效方式(如';%text';又名前缀通配符)?,mysql,wildcard,Mysql,Wildcard,MySQL中是否有任何内置功能可以在不扫描整个表的情况下执行上述操作 我找到的唯一解决方案是存储要比较的列的镜像版本,并执行类似“txet%”的 我也看不到绕过后缀搜索的方法。这是一本德语词典。许多单词都有一个带有前缀的版本,例如用户搜索“Gericht”(Engl.curt),但知道有一个单词“Amtsgericht”(Engl.district curt)也很有价值。不幸的是,在德语中,单词的两个部分通常没有空格分隔。大约15%的查询实际使用前缀搜索。MySQL不会在值以通配符开头时使用索引

MySQL中是否有任何内置功能可以在不扫描整个表的情况下执行上述操作

我找到的唯一解决方案是存储要比较的列的镜像版本,并执行类似“txet%”的


我也看不到绕过后缀搜索的方法。这是一本德语词典。许多单词都有一个带有前缀的版本,例如用户搜索“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');