2011-12-10 4 views
6

Esiste una funzionalità incorporata in MySQL per eseguire quanto sopra senza eseguire la scansione dell'intera tabella?mysql: modo efficiente per la ricerca postfix (come '% text' alias prefisso jolly)?

L'unica soluzione che ho trovato è quella di memorizzare una versione speculare della colonna che voglio confrontare e fare un like 'txet%'.

Inoltre non vedo un modo per aggirare la ricerca postfix. È per un dizionario tedesco. Molte parole hanno una versione con prefisso, ad es. l'utente cerca "Gericht" (Inglese), ma è anche utile sapere che c'è una parola "Amtsgericht" (Engl. district curt). Sfortunatamente spesso non c'è spazio per separare le due parti della parola in tedesco. Circa il 15% delle query utilizza effettivamente la ricerca prefisso.

+0

uno sguardo al 'mysql engine' sfinge o' apache solr' – cristian

+0

Grazie per l'accenno alla sfinge! Questo potrebbe risolvere alcune altre sfide che sto affrontando per es. derivanti. Per il problema di questo post userò l'approccio della colonna invertita come confermato dalle altre risposte. Sarà la soluzione più rapida e quella con meno dipendenze. – user1091141

risposta

7

Un indice sopra il campo inverso sarà la soluzione, alcuni pensano come:

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

ma MySQL non alow indice sopra espressioni, solo su colonne:

questo è MySQL create index syntax:

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

Questo è postgres create index syntax:

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

Un lavoro intorno può essere creare indicizzata secondo campo (field -> dleif) e una mysql trigger per mantenere campo inverso:

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 non utilizzerà un indice quando il valore inizia con un carattere jolly.

La memorizzazione di una seconda colonna nell'ordine inverso è un approccio difendibile. Tuttavia, fallirà con un suffisso.

Se si conoscono le parole composte, è possibile calcolare le partite "prezioso da sapere" e memorizzarle in un'altra tabella. Penso che sia improbabile che funzioni bene per un dizionario tedesco, ma potresti sapere qualcosa che io non conosco.

+0

Grazie per l'idea con le parole composte. Penso che sarebbe utile per la ricerca infissa (come '% text%'). Ma dal momento che sto facendo il prefisso o il postfix ma non l'infisso, l'approccio della colonna inversa è ciò che farò. Inoltre, sebbene io sia un nativo tedesco, prima avrei bisogno di una ricerca sulla grammatica e ho il sospetto che le possibilità di costruire composti in lingua tedesca siano infinite e quindi richiederebbero enormi quantità di dati. – user1091141

+0

Vivo in Germania. La mia impressione è che tu possa fare una parola composta valida con qualsiasi parola "n" tedesca. E non c'è limite superiore su 'n'. –

+0

Sì, è vero. Un classico esempio: Donaudampfschifffahrtsgesellschaft. Consiste dei cinque nomi Donau, Dampf, Schiff, Fahrt e Gesellschaft ... :) – user1091141