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.