2012-10-01 16 views
9

Sto costruendo una ricerca per un sito che utilizza una ricerca di testo completo. La ricerca funziona alla grande, non è un mio problema. Stringa insieme le parole chiave fornite dagli utenti (MATCH ... CONTRO ...) con le AND in modo che più parole restringano ulteriormente i risultati. Ora, so che certe parole di stop non sono indicizzate, e per me va bene che non voglio usarle come criteri di selezione. Tuttavia, se una parola chiave viene fornita nel set di parole chiave (dall'utente), uccide tutti i risultati (come previsto) anche se la parola si trova effettivamente in un determinato blocco di testo.ignorando le stringhe di testo completo mysql nella query

La mia domanda: c'è un modo per verificare se una determinata parola è una parola d'arresto al momento della richiesta? La mia soluzione preferita sarebbe semplicemente quella di escludere la parola pertinente dai criteri di ricerca (non mi interessa se un utente può restringere i risultati con la parola "nessuno", io non voglio che MySQL restituisca un set di risultati vuoto perché l'utente fornito, anche se nessuno dei due esiste nei risultati). Oppure, dovrò semplicemente svuotare l'elenco delle parole chiave? Grazie mille per qualsiasi aiuto.

modifica ---- Mi dispiace, ma in realtà non ci sono snippet di codice da prevedere per questo. Il codice funziona bene, in realtà esattamente come previsto. È più un problema logico con cui mi sto occupando. Ma, come un esempio, nel modo di spiegazione:

Diciamo che ci sono tre record, che includono le parole (ma non sono limitati a)

1: mela, arancia, mango, banana 2: uva , arancia, ananas, mango 3: patate, mango, melone, keira cavalleresco

Se la parola di ricerca immessa dall'utente è mango, tutti i risultati vengono restituiti correttamente. Se le parole sono arancione AND mango, i risultati 1 e 2 vengono restituiti (correttamente). Ora, diciamo che la banana è una parola d'arresto (non lo è ... ma supponiamo che lo sia), se la ricerca è per arancione, mango e banana, non viene restituito alcun risultato (perché la banana non è nell'indice fulltext).

Quello che sto cercando è se qualcun altro ha riscontrato questo problema e ha un modo per aggirare il problema. Una specie di:

if 'banana' NOT STOP WORD match 'banana' against `words`. (OBVIOUSLY not real code). 

Oppure ... sono io solo andando a far cadere la lista stopwords ...

+0

cosa hai provato? puoi fornirci qualche esempio? – jcho360

+0

Sembra che nessuna delle risposte abbia davvero quello che stavi cercando. È sempre possibile scrivere il codice dell'applicazione per filtrare manualmente eventuali stopword (nonché parole troppo brevi) dalla query. Questo è probabilmente quello che faremo. –

+0

2017 e lo stesso problema qui .. Sembra che mysql ricerca di testo completo è davvero povero progettato e manca di funzionalità di base .. – jgr

risposta

9

È possibile verificare le parole chiave confrontando tutte le parole non significative. Ecco l'elenco di stopwords Ho trovato una soluzione per disabilitare le stopword dal testo completo. Hai solo bisogno di trovare .cnf di file e aggiungere questo, il motore mysql

ft_stopword_file = "" 

riavvio e ricostruire gli indici;

Spero che questo lavoro

+0

Stavo pensando che questa potrebbe essere la strada avrei bisogno di andare con. Speravo davvero che qualcun altro avesse una soluzione più intelligente. Grazie per il tuo contributo. – dgeare

+0

Sono contento, funziona per voi :) –

3

Come disattivare stopwords full-text in MySQL:

Nel file di testo my.ini (MySQL):

ft_stopword_file = "" or link an empty file "empty_stopwords.txt" 
ft_min_word_len = 2 

// Impostare la lunghezza minima, ma essere consapevoli che le parole più brevi (3,2) aumenteranno drammaticamente il tempo di interrogazione, specialmente se i campi della colonna indicizzati in full text sono grandi.

Salvare il file, riavviare il server.

Il prossimo passo dovrebbe essere quello di riparare gli indici con questa query:

REPAIR TABLE tbl_name QUICK. 

Tuttavia, questo non funzionerà se si utilizza tabella è motore di storage InnoDB. Si dovrà cambiare per MyISAM:

ALTER TABLE t1 ENGINE = MyISAM; 

Così, ancora una volta:

1. Edit my.ini file and save 
2. Restart your server (this cannot be done dynamically) 
3. Change the table engine (if needed) ALTER TABLE tbl_name ENGINE = MyISAM; 
4. Perform repair      REPAIR TABLE tbl_name QUICK. 

essere consapevoli del fatto che InnoDB e MyISAM hanno le loro differenze di velocità. Uno leggere più velocemente, altre operazioni di scrittura più veloce (Per saperne di più che su internet)

+1

Va notato che InnoDB di MySQL 5.6 ha indici full-text –

1

stopword disable per la ricerca full-text in MySQL usando questa procedura

1: il file my.ini aperto in mysql

2: posto qui di seguito due linee dopo [mysqld] linea in my.ini (ricerca [mysqld] nel file di)

ft_min_word_len=1 
ft_stopword_file="" 

3: riavviare il server

4: riparare la vostra tabella utilizzando sotto il comando

> repair table tablename; 

5: ora la ricerca sta lavorando ....

0

provare a utilizzare PARTITA CONTRO ... ... IN BOOLEAN MODE Come questo: WHERE MATCH (autore, titolo) CONTRO (' "origine di" "IN MODALITÀ BOOLEANA";

+0

le parole di arresto non sono in indici di testo completo, quindi anche se si utilizza la modalità booleana, non verrà restituito nulla –

0

impostazione ft_stopword_file = ""
non ha funzionato per me, sto usando le tabelle InnoDB e MySQL 5.6 (smettere di parole ancora non indicizzate su indici full-text dopo l'ottimizzazione tabella associata)

questa soluzione funziona (anche se non siete super-utente):

CREATE TABLE mydb.stopwordslist(value VARCHAR(20)) ENGINE = INNODB; 
INSERT INTO mydb.stopwordslist(value) VALUES ('skipthisword'); 

per tutti gli utenti, ma è ancora necessario diritti utente super:

SET GLOBAL innodb_ft_server_stopword_table = 'mydb/stopwordslist'; 

solo per l'utente (ammesso che quello che ricreare gli indici e le colonne di aggiornamento)

SET SESSION innodb_ft_user_stopword_table = 'mydb/stopwordslist'; 

in quanto è una variabile di sessione, che non durerà a quando la sessione viene chiusa in modo da assicurarsi che lo si imposta a ogni sessione o prima di ottimizzare o inserire in tabelle con indice di testo completo o quando si aggiorna la colonna indicizzata per indice di testo completo

Problemi correlati