Hitung MATCH () AGAINST () skor dari QUERY UNIFIED bukan FOR EACH TABLE

10

Saya mencoba memiliki skor untuk seluruh bagian dari pernyataan 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')

Dalam kasus tersebut skor per tabel + nilai tidak diurutkan berdasarkan relevansi

Tetapi saya mencoba metode ini, yang berfungsi tetapi tidak layak untuk diproduksi

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

Kode di atas tidak disukai karena skor ada per tabel, mereka bergabung dan dipesan. Pendekatan yang buruk.

Jadi saya mencoba MATCH() AGAINST()untuk datadalam TOP LEVEL SELECT juga ini. (TIDAK BEKERJA)

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

Pernyataan di atas sangat cocok untuk saya, tetapi tidak berfungsi karena datakolom dibuat langsung dan tidak mendukung untuk memiliki INDEX FULLTEXT.

Pertanyaan saya adalah bagaimana melanjutkan untuk membuat mesin saya berfungsi.

  • Bisakah Anda entah bagaimana membuat dataFULLTEXT
  • Apakah ada cara untuk membuatnya berfungsi selain DI MODE BOOLEAN yang tidak mendukung skor
  • Apakah ada pendekatan untuk seluruh topik ini yang akan membuatnya berhasil? Membuat tabel sementara tidak menyelesaikan ini, aturan 50% dari MATCH () TERHADAP () membuat kueri menghasilkan 0 hasil, tetapi ada banyak
  • Mungkin ada sedikit hal yang saya rindukan?
  • Membuat VIEW juga tidak berfungsi, MySQL tidak mendukung INDEX-es pada VIEWs.
  • Mungkin itu ide yang baik untuk menggunakan MODE DI BOOLEAN dan membuat penilaian secara manual?

Saya telah bekerja untuk masalah ini selama lebih dari dua hari. Jadi saya mohon bantuan. Terima kasih.

dachint
sumber

Jawaban:

2

Mungkin Anda bisa merekam berikut ini dari tiga (3) tabel

  • nama tabel
  • kolom dari nama tabel
  • Indeks FULLTEXT pada kolom

Ini kodenya:

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;

Sekarang Anda dapat menjalankan kueri tunggal terhadap satu tabel

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

Cobalah !!!

RolandoMySQLDBA
sumber
Saya pernah melakukan hal serupa sebelumnya dan tidak berhasil. Yang ini juga tidak bekerja. Final SELECT dari collected_data sebagai good_score dengan MATCH () dan AGAINST () memberikan hasil 0. Saya meneliti tentang masalah ini dan menemukan bahwa MODE NON IN BOOLEAN menerapkan aturan 50%, yang pada dasarnya mengabaikan hasil dari satu tabel ketika ada beberapa hubungan matematika dengan 50% hasil. Tetap saja, terima kasih atas sarannya, tetapi saya ingin mendengar beberapa ide lain. Terima kasih lagi.
dachint