2012-09-07 23 views
6

Sto riscontrando un problema quando provo a eseguire una ricerca full text in modalità booleana usando una stringa con una virgoletta singola e un carattere jolly asterisco, cioè "levi's *": sembra cercare anche per tutte le parole che iniziano con "s", come "spears", quando, per quanto ne so, la citazione dovrebbe essere considerata parte della parola mentre due virgolette singole ('') sarebbero una parola separatore ... ma forse Mi sbaglio.Interrogazione full text con una virgoletta singola

prega, guardare l'esempio qui: http://www.sqlfiddle.com/#!2/3dd3e/2/0 - seconda fila should't essere lì

come posso fare quello che voglio?

risposta

1

questo ti dà i due file dal vostro esempio:

SELECT * 
FROM ft 
WHERE MATCH(value) AGAINST ('"levi\'s" lacost*' IN BOOLEAN MODE) 

In http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html alla fine, si parla di corrispondenze esatte tra virgolette. Quindi sfuggi alla singola citazione e hai finito.

Utilizzando parentesi, è possibile aggiungere l'asterisco:

WHERE MATCH(value) AGAINST ('(levi\'s)* lacost*' IN BOOLEAN MODE) 
+0

problema è che nessuna di queste domande troverebbe cioè 'levi'strauss', il asterisco dopo le doppie virgolette non sembra fare nulla ("lacost" * non funzionerebbe anche) – Borgtex

+0

Devo dire che non ho usato 'MATCH()' mai.Userei invece usare un'espressione regolare. –

+1

sembra che l'uso delle parentesi sia di aiuto migliore .... (vedi risposta aggiornata) –

1

Credo che si dovrebbe virgolette la stringa è necessario cercare per se contiene apici

Esempio: MATCH(value) AGAINST ('"levi\'s"* lacost*' IN BOOLEAN MODE)

0

trasporta sulle spalle il commento di Bart per gestire l'apice singolo e avere ancora la funzione di ricerca come come, ho trattato ogni termine separatamente. Quindi la logica è: se un termine ha una singola citazione, avvolgila con una parentesi, altrimenti lasciala. Ecco po 'di codice PHP che può aiutare

$term = preg_replace("/[']/", "\'", $term); 
$terms = explode(' ',$term); 
foreach ($terms as &$t) { 
    if (strpos($t, "'")) { 
     $t = "(".$t.")"; 
    } 
} 
$term = implode(' ',$terms); 

la mia partita è contro ('$ termine' IN BOOLEAN MODE

Problemi correlati