Calcola i punteggi MATCH () CONTRO () da QUERY UNIFICATA non PER OGNI TABELLA


10

Sto cercando di ottenere un punteggio per l'intera sezione delle istruzioni SELECT

SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword')
UNION
SELECT *,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword')
UNION
SELECT *,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword')

In tal caso i punteggi sono per tabella + non sono ordinati per rilevanza

Ma ho provato questo metodo, che funziona ma non vale la produzione

SELECT * FROM (
    SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword')
    UNION
    SELECT *,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword')
    UNION
    SELECT *,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword')
) as `combined` ORDER BY `score` DESC

Il codice sopra non è apprezzato perché i punteggi sono presenti per tabella, vengono uniti e ordinati. Un cattivo approccio.

Così ho cercato di MATCH() AGAINST()per datain PRIMO LIVELLO SELEZIONE pure questo. (DIDN'T WORK)

SELECT *,MATCH(`data`) AGAINST('keyword') as `good_score` FROM (
        SELECT *,`result` as `data`,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword')
        UNION
        SELECT *,`content` as `data`,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword')
        UNION
        SELECT *,`text` as `data`,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword')
    ) as `combined` ORDER BY `good_score` DESC

L'istruzione precedente è perfetta per me, ma non funziona perché la datacolonna viene creata al volo e non supporta l'indice FULLTEXT.

La mia domanda è come procedere per far funzionare il mio motore.

  • Puoi in qualche modo fare dataun FULLTEXT
  • Esiste un modo per farlo funzionare diverso da IN BOOLEAN MODE che non supporta i punteggi
  • C'è un approccio a questo intero argomento che potrebbe farlo funzionare? La creazione di una tabella temporanea non risolve questo problema, la regola del 50% di MATCH () CONTRO () fa sì che una query restituisca 0 risultati, ma ci sono molti
  • Forse c'è qualcosa di poco che mi manca?
  • La creazione di una VISTA non funziona neanche, MySQL non supporta INDEX-es su VISUALIZZAZIONI.
  • Forse è una buona idea usare IN MODALITÀ BOOLEANA e creare il punteggio manualmente?

Ho lavorato per questo problema per più di due giorni. Quindi chiedo gentilmente un aiuto. Grazie.

Risposte:


2

Forse potresti registrare quanto segue dalle tre (3) tabelle

  • nome della tabella
  • la colonna dal nome della tabella
  • Indice FULLTEXT sulla colonna

Ecco il codice:

DROP TABLE IF EXISTS combined_data;
CREATE TABLE combined_data
(
    source_table VARCHAR(64),
    source_id INT NOT NULL,
    data TEXT NOT NULL,
    FULLTEXT (data)
) ENGINE=MyISAM;
--
ALTER TABLE combined_data DISABLE KEYS;
--
INSERT INTO combined_data (source_table,source_id,data) VALUES
SELECT 'table1',id,`result` FROM table1 WHERE MATCH(`result`) AGAINST('keyword');
--
INSERT INTO combined_data (source_table,source_id,data) VALUES
SELECT 'table2',id,`content` FROM table1 WHERE MATCH(`content`) AGAINST('keyword');
--
INSERT INTO combined_data (source_table,source_id,data) VALUES
SELECT 'table3',id,`text` FROM table1 WHERE MATCH(`text`) AGAINST('keyword');
--
ALTER TABLE combined_data ENABLE KEYS;

Ora puoi eseguire una singola query sull'unica tabella

SELECT *,MATCH(`data`) AGAINST('keyword') as `good_score`
FROM combined_data
ORDER BY `good_score` DESC;

Provaci !!!


Ho fatto cose simili prima e non ha funzionato. Anche questo non funziona. Il comando SELECT finale di combinati_data come good_score con MATCH () e AGAINST () fornisce un risultato 0. Ho studiato questo problema e ho scoperto che NON IN MODALITÀ BOOLEANA applica la regola del 50%, che per sua natura ignora in qualche modo i risultati di una tabella quando c'è una relazione matematica con il 50% dei risultati. Tuttavia, grazie per il suggerimento, ma vorrei sentire alcune altre idee. Grazie ancora.
dachints
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.