2011-12-10 81 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