Domanda

sto facendo una lista di sinonimi che mi riporlo in banca dati e recuperare prima di fare ricerca a testo integrale.

Quando gli utenti entra come: parola1

ho bisogno di ricerca per questa parola nel mio tavolo sinonimi. Quindi, se si trova la parola, vorrei scegliere tutti i sinonimi di questa parola e usarla nella ricerca full-text sulla prossima query in cui ho contruct la query come

MATCH (columnname) CONTRO ((word1a word1b word1c) IN BOOLEAN MODE)

Quindi, come faccio a memorizzare i sinonimi in una tabella? Ho trovato 2 scelte:

  1. con chiave e parola colonne come

    val  keyword
    -------------
    1    word1a
    1    word1b
    1    word1c
    2    word2a
    2    word2b
    3    word3a
    etc.
    

Così allora posso trovare corrispondenza esatta della parola inserita in una query e lo trovo di ID. Nella successiva selezionare ricevo tutte le parole con tale ID e in qualche modo concate utilizzando un ciclo di record nel langauge lato server. Posso quindi costruire la ricerca reale sulla tabella principale che ho bisogno di cercare le parole.

  1. utilizzando solo le colonne di parole come

    word1a|word1b|word1c
    word2a|word2b|word2c
    word3a
    

Ora ho così SELECT per la mia parola, se è all'interno di qualsiasi record, se lo è, estrarre tutti i record di esplodere e che a | e io ho le mie parole ancora una volta che posso usare.

Questo secondo approccio lookes più facile da mantenere per chi farebbe questo database dei sinonimi, ma vedo 2 problemi:

a) Come faccio a trovare in MySQL se una parola è all'interno della stringa? Non posso LIKE 'word1a' perché Sinonimi può essere molto simili in un word1a modo potrei essere strowberry e strowberries potrei essere uccelli e la parola 2a potrebbe essere bacca. Ovviamente ho bisogno di corrispondenza esatta, così come potrebbe una dichiarazione come abbinare esattamente all'interno di una stringa?

b) vedo un problema di velocità, utilizzando COME avrebbe immagino prendere prendere più mysql che "=" con il primo approccio in cui ho esatto abbinare una parola. D'altra parte nella prima opzione che ho bisogno di 2 affermazioni, uno per ottenere l'ID della parola e la seconda per ottenere tutte le parole con questo ID.

Come si risolvere questo problema, più di un dilemma che avvicini a prendere? C'è una terza via non vedo che è facile per admin per aggiungere / modificare i sinonimi e nello stesso tempo veloce e ottimale? Ok lo so che non c'è modo migliore di solito; -)

Aggiorna : La soluzione di utilizzare due tavoli uno per Master parola e secondo per le parole sinonimo non funziona nel mio caso. Perché io non ho una parola MASTER che utente digita nel campo di ricerca. Egli può digitare qualsiasi dei sinonimi nel campo, in modo da sto ancora chiedendo come impostare questa tabelle come io non ho parole maestri che avrei dovuto ID di in una tabella e Sinonimi con ID del maestro nella seconda tabella. Non c'è una parola master.

È stato utile?

Soluzione

Non utilizzare un (uno) stringa per memorizzare diverse voci.

In altre parole: Costruire una tabella di parole (word_ID, word) e un tavolo sinonimo (word_ID, synonym_ID) quindi aggiungere la parola al tavolo parola e una voce per sinonimo al tavolo sinonimi.

Aggiorna (aggiunta 3 ° sinonimo)

la tabella di Word deve contenere ogni parola (ALL), la tabella sinonimo detiene solo puntatori ai sinonimi (non una sola parola!) ..

Se tu avessi tre parole: A, B e C, che sono sinonimi, vostro DB sarebbe

WORD_TABLE            SYNONYM_TABLE
ID | WORD             W_ID | S_ID
---+-----             -----+-------
1  | A                  1  |  2
2  | B                  2  |  1
3  | C                  1  |  3
                        3  |  1
                        2  |  3
                        3  |  2  

Non abbiate paura delle tante voci nel SYNONYM_TABLE, che saranno gestiti dal computer e sono necessari per riflettere le relazioni esistenti tra le parole.



2 ° approccio

Si potrebbe anche essere tentato (non credo che si dovrebbe!) Per andare con una tabella che ha campi separati per parola e un elenco di sinonimi (o ID) (word_id, parola, synonym_list). Attenzione che questo è in contrasto con il modo in cui una relazionali opere DB (un campo, un fatto).

Altri suggerimenti

Credo 3 colonne e un solo tavolo è meglio WORD_TABLE

ID | WORD | GroupID
---+----------------
1  |  A   |   1
2  |  B   |   1
3  |  C   |   1

Un altro approccio è quello di memorizzare il che significa (questo non usa parole di master, ma un tavolo senso che i gruppi, invece)

potrebbe essere quella di memorizzare le parole in una tabella le parole senza i sinonimi e con solo il testo, in questo modo:

Molte parole, un significato

meaning_table

meaning_id
---
1
2
3

e memorizzare le parole un altro tavolo, per esempio se A, B e C erano tutti sinonimi di 1 significato

word_table

word_id | meaning_id | word
--------+------------+------
1       |  1         |   A
2       |  1         |   B
3       |  1         |   C

Anche se sembra molto simile a quello che Hasan Amin Sarand suggerisce, ha la differenza fondamentale che non si seleziona dalla WORD_TABLE ma invece selezionare dal MEANING_TABLE, questo è molto meglio e ho imparato che il modo difficile.

In questo modo si memorizza il significato in una tabella e il maggior numero di parole per quel significato, come si come in un altro.

Anche se si presuppone che 1 significato per parola.

Molte parole, molti significati

se si desidera memorizzare le parole con più significati, allora avete bisogno di un altro tavolo per la relazione molti a molti e il tutto diventa:

meaning_table
-------------
meaning_id
-------------
1
2
3

word_meaning_table
--------------------
word_id | meaning_id
--------+-----------
1       |  1         
2       |  1        
3       |  1         

word_table
--------------
word_id | word
--------+-----
1       |   A
2       |   B
3       |   C

Ora si può avere il maggior numero di parole con le quali molti significati che vuoi, dove ogni parola può significare tutto quello che vuoi e di qualsiasi significato può avere molte parole.

Se si desidera selezionare una parola ed è sinonimi poi si fa

SELECT 
meaning_id,word_id,word
FROM meaning_table 
INNER JOIN word_meaning_table USING (meaning_id)
INNER JOIN word_table USING (meaning_id)
WHERE meaning_id=1

È anche possibile quindi memorizzare il che significa che non hanno una parola ancora o che non conoscono la parola di.

Se non si sa che cosa significa che appartiene ad allora si può solo inserto un nuovo significato per ogni nuova parola e fissare il meaning_id nel word_table tardi.

È quindi possibile anche archiviare e selezionare le parole che sono le stesse, ma le cose medi diverso

SELECT 
meaning_id,word_id,word
FROM meaning_table 
INNER JOIN word_meaning_table USING (meaning_id)
INNER JOIN word_table USING (meaning_id)
WHERE word_id=1
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top