2011-12-10 67 views
6

MySQL中是否有任何内置功能可以在不扫描整个表的情况下执行上述操作?mysql:后缀搜索的有效方式(如'%text'aka。前缀通配符)?

我发现的唯一解决方案是存储我想要比较的列的镜像版本,并执行like 'txet%'

我也没有看到避开后缀搜索的方法。这是一本德语字典。许多单词都有一个带前缀的版本,例如用户搜索“Gericht”(英语简称),但知道有一个词“Amtsgericht”(英语区简报)也很有价值。不幸的是,德语中通常没有空格分隔单词的两个部分。约15%的查询实际使用前缀搜索。

+0

看看'mysql的狮身人面像engine'或'阿帕奇solr' – cristian

+0

谢谢你对狮身人面像的暗示!这可以解决我面临的其他一些挑战,例如,制止。对于这篇文章的问题,我将使用其他答案确认的颠倒列方法。这将是最快的解决方案,也是最不依赖的解决方案。 – user1091141

回答

7

通过反向领域的指数将是解决方案,有些人认为这样的:

create index idx_reverse on table (reverse(field)); 
select * from table where reverse(field) like 'txet%'; 

但MySQL的不超过alow表情,只在列指数:

这是MySQL create index syntax

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name 
    [index_type] 
    ON tbl_name (index_col_name,...) 
    [index_option] ... 

这是postgres create index syntax

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ] 
    ({ column | (expression) } [ opclass ] [, ...]) 
    ... 

一个工作围绕可能是创建索引的第二场(场 - > 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'); 
1

当您的值以通配符开头时,MySQL不会使用索引。

以相反顺序存储第二列是一种可行的方法。不过,它会在后缀上失败。

如果您知道复合词,您可以预先计算“有价值的知道”匹配并将它们存储在另一个表中。我认为这不太可能适用于德语字典,但你可能知道我没有的东西。

+0

感谢与复合词的想法。我认为这对中缀搜索很有用(如'%text%')。但由于我在做前缀或后缀而不是中缀,反向列方法就是我所要做的。另外,虽然我是德国本地人,但首先需要对语法进行一些研究,并且我怀疑,以德语编写复合词的可能性是无穷无尽的,因此需要大量数据。 – user1091141

+0

我曾经住在德国。我的印象是,你可以用任何“n”个德语单词来制作一个有效的复合词。 'n'没有上限。 –

+0

是的,这是真的。一个典型的例子:Donaudampfschifffahrtsgesellschaft。它由五个名词Donau,Dampf,Schiff,Fahrt和Gesellschaft组成...... :) – user1091141