2016-01-15 13 views
8

Ho letto alcune articles e issues, ma non riusciva a trovare una soluzione soddisfacente. Voglio selezionare i record correlati dal database quando un utente compila un modulo; allo stesso modo la funzionalità funziona su questo sito quando fai una domanda.MySQL ricerca full-text con confini di parola

consideri una tabella del database con i seguenti tre record nella colonna subject

+---+---------------------------------------------------+ 
| 1 | Pagina aanmaken en beter doorzoekbaar maken  | 
+---+---------------------------------------------------+ 
| 2 | Sorteerfunctie uitbreiden in zoek-en-boek functie | 
+---+---------------------------------------------------+ 
| 3 | Zoek de verschillen tussen de pagina's   | 
+---+---------------------------------------------------+ 

inizio la mia query di ricerca con la parola zoek quindi voglio per interrogare i risultati più rilevanti dal database sul termine zoek. Sono venuto con la seguente query:

SELECT 
    id, 
    subject, 
    MATCH(
     subject 
    ) 
    AGAINST(
     'zoek*' 
     IN BOOLEAN MODE 
    ) 
    AS 
     score 
FROM 
    Issues 
WHERE 
    MATCH(
     subject 
    ) 
    AGAINST(
     'zoek*' 
     IN BOOLEAN MODE 
    ) 

quando faccio funzionare questa domanda mi aspettavo tutti i record da mostrare e (probabilmente, non so come funziona la specificità in MySQL) ID 3 per visualizzare in cima (perché la parola esatta corrisponde).

Invece i risultati della query erano solo riga 2 e 3 con esattamente lo stesso punteggio (0,031008131802082062).

cosa ho bisogno di cambiare nella mia domanda per abbinare le opportune registrazioni? Anche considerando che gli utenti possono digitare parole chiave o frasi.

+0

Perché ti aspettavi di vedere tutti i record nel risultato? Il record 1-st non contiene la parola 'zoek' –

+0

La risposta di @ r-costa in basso è corretta. Inoltre, potresti voler controllare "Come viene calcolato il ranking di pertinenza" su http://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html. MySQL sta facendo ciò che dovrebbe fare qui. Se hai bisogno di una ricerca di testo più completa, probabilmente devi usare qualcosa di basato su Lucene (Solr, Elasticsearch, ecc.). – evanv

risposta

0

C'è un workaound per il vostro caso:

SELECT 
    id, 
    subject, 
    IF (subject LIKE "zoek %" OR subject LIKE "% zoek %" OR subject LIKE "% zoek", 
     1, 
     IF (subject LIKE "% zoek%", 
      0.5, 
      IF (subject LIKE "%zoek%", 
       0.2, 
       0) 
      ) 
     ) as score 
FROM 
    Issues 
WHERE subject LIKE "%zoek%" 
ORDER by score DESC 

Risultato atteso:

+---+---------------------------------------------------+------+ 
|id | subject           |score |  
+---+---------------------------------------------------+------+ 
|3 | Zoek de verschillen tussen de pagina's   | 1 | 
+---+---------------------------------------------------+------+ 
|2 | Sorteerfunctie uitbreiden in zoek-en-boek functie | 0.5 | 
+---+---------------------------------------------------+------+ 
|1 | Pagina aanmaken en beter doorzoekbaar maken  | 0.2 | 
+---+---------------------------------------------------+------+ 
+0

Funziona esattamente come voglio quando cerco una singola parola. Un problema collaterale è che voglio cercare su più parole. Se cambio il termine di ricerca in "de zoek'", ad esempio, non ottengo alcun record. Ma grazie per questo approccio finora! – Maurice

2

La ricerca full-text di MySQL non supporta i suffissi.

per ottenere la prima fila si dovrà fare una partita contro '* * zoek' attualmente non ammessi.

L'alternativa è quella di utilizzare

SELECT id, subject 
FROM Issues 
WHERE subject LIKE '%zoek%' 
0

Siamo spiacenti ...

Medio di parola (doorzoekbaar) è, per definizione di, non qualcosa di FULLTEXT MySQL che verrà trovato. FULLTEXT non ha alcun concetto di "nomi composti", quindi non cercherà di distinguere la parola.

La definizione di una "parola" in FULLTEXT dare 'trattino' e 'spazio' lo stesso significato - vale a dire un limite di parola. Così, zoek de... e zoek-... sono dati lo stesso peso.

Guardate Solr, Lucene, ed altre "soluzioni full-text" 3rd party. Possono (o non possono) fornire ciò che vuoi.

zoek* e +zoek*, se eseguito con IN BOOLEAN MODEsi trovare zoekbaar.

1

Prova questa query per ottenere risultati diversi:

  1. Selezionare tutti soggetti che inizia con la lettera "z":
    SELECT ID, Subject FROM table_name WHERE Subject LIKE 'z%';

  2. Seleziona tutti soggetti che termina con la lettera "z":
    SELECT ID, Subject FROM table_name WHERE Subject LIKE '%z';

  3. Seleziona tutto il soggetto contenente lo schema "zoek":
    SELECT ID, Subject FROM table_name WHERE Subject LIKE '%zoek%';

1

Come altri invitati, FULLTEXT indici di MySQL non supportano i caratteri jolly leader, e quindi non può aiutare nella ricerca di suffissi.

Tuttavia, la nuova ngram Full-Text Parser potrebbe aiutare:

Il built-in MySQL full-text parser utilizza lo spazio vuoto tra le parole come delimitatore per determinare dove parole inizio e la fine, che è una limitazione quando si lavora con linguaggi ideografici che non usano delimitatori di parole. Per risolvere questa limitazione, MySQL fornisce un parser full-text ngram (...).

Un ngram è una sequenza contigua di n caratteri di una determinata sequenza di testo. Il parser ngram tokenizza una sequenza di testo in una sequenza contigua di n caratteri.

Come non ho mai usato questa funzione, non posso aiutare ulteriormente su questo argomento. Avviso però:

Perché un Ngram indice FULLTEXT contiene solo ngrams, e non contiene informazioni circa l'inizio dei termini, ricerche con caratteri jolly possono restituire risultati imprevisti.

Problemi correlati