Berechnen Sie MATCH () GEGEN () Punkte aus UNIFIED QUERY nicht für jede Tabelle

10

Ich versuche, eine Punktzahl für den gesamten Abschnitt der SELECT-Anweisungen zu erhalten

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 diesem Fall sind die Bewertungen pro Tabelle + nicht nach Relevanz geordnet

Aber ich habe diese Methode ausprobiert, die funktioniert, aber keine Produktion wert ist

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

Der obige Code wird nicht gemocht, da es Punktzahlen pro Tabelle gibt, die zusammengefügt und sortiert werden. Ein schlechter Ansatz.

Also habe ich versucht , um MATCH() AGAINST()für datain TOP LEVEL SELECT dies auch. (Hat nicht funktioniert)

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

Die obige Anweisung ist perfekt für mich, funktioniert aber nicht, da die dataSpalte im laufenden Betrieb erstellt wird und die Verwendung eines FULLTEXT-INDEX nicht unterstützt wird.

Meine Frage ist, wie ich vorgehen soll, um meinen Motor zum Laufen zu bringen.

  • Kannst du irgendwie dataeinen FULLTEXT machen ?
  • Gibt es eine andere Möglichkeit als IN BOOLEAN MODE, die keine Punktzahlen unterstützt?
  • Gibt es einen Ansatz für dieses gesamte Thema, mit dem es funktioniert? Das Erstellen einer temporären Tabelle löst dies nicht. Die 50% -Regel von MATCH () AGAINST () bewirkt, dass eine Abfrage 0 Ergebnisse zurückgibt, aber es gibt viele
  • Vielleicht gibt es etwas, das ich vermisse?
  • Das Erstellen einer VIEW funktioniert auch nicht, MySQL unterstützt keine INDEX-es auf VIEWs.
  • Vielleicht ist es eine gute Idee, den IN BOOLEAN-MODUS zu verwenden und die Bewertung manuell zu erstellen?

Ich arbeite seit mehr als zwei Tagen für dieses Problem. Deshalb bitte ich um Hilfe. Vielen Dank.

Dachints
quelle

Antworten:

2

Vielleicht könnten Sie Folgendes aus den drei (3) Tabellen aufzeichnen

  • Tabellenname
  • die Spalte aus dem Tabellennamen
  • FULLTEXT-Index für die Spalte

Hier ist der Code:

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;

Jetzt können Sie eine einzelne Abfrage für eine Tabelle ausführen

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

Versuche es !!!

RolandoMySQLDBA
quelle
Ich habe das schon mal gemacht und es hat nicht funktioniert. Dieser funktioniert auch nicht. Final SELECT aus kombinierten_Daten als good_score mit MATCH () und AGAINST () ergibt ein 0-Ergebnis. Ich habe über dieses Problem recherchiert und herausgefunden, dass NON IN BOOLEAN MODE eine 50% -Regel anwendet, die naturgemäß die Ergebnisse einer Tabelle ignoriert, wenn eine mathematische Beziehung zu 50% der Ergebnisse besteht. Trotzdem, danke für den Vorschlag, aber ich würde gerne einige andere Ideen hören. Danke noch einmal.
Dachints