HER TABLO İÇİN DEĞİL, BİRLEŞTİRİLMİŞ SORGULAN MATCH () puanlarını hesaplayın


10

SELECT ifadelerinin tüm bölümü için bir puan almaya çalışıyorum

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')

Bu gibi durumlarda puanlar tabloya göre + alaka düzeyine göre sıralanmaz

Ama işe yarayan ama üretime değmeyen bu yöntemi denedim

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

Yukarıdaki kod beğenilmez çünkü tablo başına puanlar birleştirilir ve sıralanır. Kötü bir yaklaşım.

Bu yüzden çalıştı MATCH() AGAINST()için datade bu şekilde TOP seviyesini seçin. (ÇALIŞMADI)

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

Yukarıdaki ifade benim için mükemmel, ancak datasütun anında oluşturulduğu ve FULLTEXT INDEX'e sahip olması desteklemediği için çalışmıyor.

Benim sorum motorumu çalıştırmak için nasıl devam edeceğim.

  • Bir şekilde dataFULLTEXT yapabilir misin
  • Puanları desteklemeyen BOOLEAN MODU dışında çalışmasını sağlayan herhangi bir yol var mı
  • Bu konunun tamamında işe yarayacak bir yaklaşım var mı? Geçici bir tablo oluşturmak bunu çözmez,% 50 MATCH () AGAINST () kuralı bir sorgu 0 sonuç döndürür, ancak birçok
  • Belki özlediğim küçük bir şey var mı?
  • Bir VIEW oluşturmak da çalışmaz, MySQL, VIEW'larda INDEX-es'i desteklemez.
  • BOOLEAN MODE IN kullanmak ve manuel olarak puanlama oluşturmak iyi bir fikir olabilir mi?

Bu konu için iki günden fazla süredir çalışıyorum. Bu yüzden lütfen biraz yardım istiyorum. Teşekkürler.

Yanıtlar:


2

Belki üç (3) tablodan aşağıdakileri kaydedebilirsiniz

  • Tablo ismi
  • tablo adındaki sütun
  • Sütunda FULLTEXT dizini

İşte kod:

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;

Artık bir tabloya karşı tek bir sorgu çalıştırabilirsiniz

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

Bir şans ver !!!


Daha önce benzer bir şey yaptım ve işe yaramadı. Bu da işe yaramıyor. Combined_data'dan MATCH () ve AGAINST () ile good_score olarak nihai SELECT, 0 sonuç verir. Bu sorunu araştırdım ve BOOLEAN MODE OLMAYAN% 50 kural uyguladığını öğrendim, bu da doğası gereği sonuçların% 50'si ile bazı matematiksel ilişki olduğunda bir tablodaki sonuçları yok sayar. Yine de, öneri için teşekkür ederim, ama başka fikirler duymak istiyorum. Tekrar teşekkürler.
— dachints
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.