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.

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 !!!


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.