2013-03-19 27 views
5

Quale sarebbe un buon modo per cercare un campo, ignorando gli spazi nel termine di ricerca E il campo?MySQL - Cerca in un campo che ignora gli spazi

Esempio:

SELECT * 
FROM tablename 
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%' 

esempio reale:

Il mio cliente ha un sito web che vende motori di blocco lungo. Tuttavia, spesso fanno in modo che le persone cerchino sul loro sito "cat 3306 longblock" (anziché "cat 3306 long block"). Abbiamo bisogno dei motori "long block" da mostrare quando si cerca "longblock".

Nota: probabilmente non ha importanza ai fini di questa domanda, ma questo sito Web è stato creato utilizzando PHP 5.3 e phpActiverecord.

risposta

2

Si potrebbe anche prendere in considerazione Sphinx oppure Lucene per il testo completo come ricerche sul testo completo di mysql. Non li ho usati personalmente, ma ho sentito che entrambi sono superiori agli indici fulltext di mysql.

Una cosa da notare con tutti questi metodi è che richiedono un indice speciale da mantenere aggiornato che aggiunge più manutenzione e sovraccarico del server.

buon articolo su sfinge: http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

Per una soluzione non richiede manutenzione che fa bene per il nome del prodotto o il numero è solo per dividere i termini di ricerca degli utenti da spazi e aggiungere LIKE '% termine%' per ciascun alla tua richiesta .

Inoltre, creo un campo di ricerca speciale che è il nome o il numero del prodotto con i token alfabetici e spazi e simboli spogliati. È necessario aggiornare questo campo ogni volta che cambia il nome del prodotto. Quindi, oltre alle query relative al campo originale, cercare I OR rispetto a questo nuovo campo rimosso. Esempio se hai un nome di prodotto come "cat 3306 longblock", quindi crea un campo product_name_search e posiziona "3306catlongblock". Quando un utente cerca 3306 long-block si elabora la ricerca da simboli di strippaggio e splitting su spazi:

WHERE (other product name search clauses) OR 
    (product_name_search LIKE '%3306%' AND product_name_search LIKE '%longblock%') 

Questo processo non è buono come testo libero ma lo fa abbastanza bene per i nomi e numeri.

+0

Grazie, Tim. Il campo di ricerca speciale potrebbe funzionare.Il problema più grande è che stiamo cercando "3306 longblock" quando il prodotto è denominato "Cat 3306 Long Block". Si noti la mancanza di spazio nel termine di ricerca. –

+1

dovrai dividere la ricerca '3306 longblock' in ... LIKE '% 3306%' AND ... LIKE '% longblock%' rispetto al campo product_name_search elaborato –

+0

Questo ha funzionato, grazie a Tim. –

3

Suggerirei ci sono un certo numero di approcci, a seconda di quanto semplice si vuole farlo. Io personalmente userei ricerca full-text utilizzando i principi enunciati qui http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

ma si potrebbe anche togliere gli spazi fuori del termine di ricerca utilizzando un'espressione regolare cioè

$str=preg_replace('/\s+/', '', $str); 
+0

Grazie per la risposta. Gli spazi non sono nel termine di ricerca. Sono nel campo che stiamo cercando. Stiamo cercando "longblock" e il campo contiene "long block". –

+0

in questo caso la ricerca full text dovrebbe aiutarti ... – diagonalbatman

+0

Gotcha. Verificherò ... grazie! –

0

C'è un modo utilizzando la funzione di replicazione. Esempio:

SELECT * FROM `products` where REPLACE(PartName, ' ', '') = REPLACE('0 1 3000 70 27', ' ', '') 
Problemi correlati