คำนวณ MATCH () เทียบกับ () คะแนนจาก QUERY QUERY ที่ไม่ใช่สำหรับแต่ละตาราง


10

ฉันพยายามที่จะมีคะแนนสำหรับส่วนทั้งหมดของคำสั่ง 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')

ในกรณีดังกล่าวคะแนนต่อตาราง + พวกเขาจะไม่เรียงตามความเกี่ยวข้อง

แต่ฉันลองวิธีนี้ซึ่งใช้งานได้ แต่ไม่คุ้มค่ากับการผลิต

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

รหัสข้างต้นไม่ชอบเพราะคะแนนมีต่อตารางพวกเขาจะเข้าร่วมและสั่งซื้อ วิธีการที่ไม่ดี

ดังนั้นฉันจึงพยายามที่จะMATCH() AGAINST()เลือกdataในระดับสูงสุดเช่นนี้ (ไม่ทำงาน)

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

ข้อความข้างต้นนั้นสมบูรณ์แบบสำหรับฉัน แต่มันไม่ทำงานเพราะdataคอลัมน์ถูกสร้างขึ้นทันทีและไม่สนับสนุนให้มี FULLTEXT INDEX

คำถามของฉันคือวิธีการทำให้เครื่องยนต์ทำงานต่อไป

  • คุณสามารถสร้างdataFULLTEXT ได้ไหม
  • มีวิธีใดบ้างที่จะทำให้มันทำงานนอกเหนือจาก IN BOOLEAN MODE ที่ไม่รองรับคะแนน
  • มีวิธีการในหัวข้อทั้งหมดนี้ที่จะทำให้การทำงานหรือไม่ การสร้างตารางชั่วคราวไม่ได้แก้ปัญหานี้กฎ 50% ของ MATCH () เทียบกับ () ทำให้แบบสอบถามส่งคืนผลลัพธ์ 0 แต่มีจำนวนมาก
  • อาจมีบางสิ่งเล็กน้อยที่ฉันคิดถึง
  • การสร้าง VIEW ไม่ทำงานเช่นกัน MySQL ไม่รองรับ INDEX-es บน VIEW
  • อาจเป็นความคิดที่ดีที่จะใช้ IN BOOLEAN MODE และสร้างคะแนนด้วยตนเอง?

ฉันทำงานกับปัญหานี้มานานกว่าสองวันแล้ว ดังนั้นฉันขอความช่วยเหลือ ขอบคุณ

คำตอบ:


2

บางทีคุณสามารถบันทึกสิ่งต่อไปนี้จากตารางสาม (3)

  • ชื่อตาราง
  • คอลัมน์จากชื่อตาราง
  • ดัชนี FULLTEXT ในคอลัมน์

นี่คือรหัส:

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;

ตอนนี้คุณสามารถเรียกใช้แบบสอบถามเดียวกับหนึ่งตาราง

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

ให้มันลอง !!!


ฉันเคยทำสิ่งที่คล้ายกันมาก่อนและมันไม่ทำงาน อันนี้ไม่ทำงานอย่างใดอย่างหนึ่ง SELECT ขั้นสุดท้ายจาก collab_data เป็น good_score ด้วย MATCH () และอีกครั้ง () ให้ผลลัพธ์ 0 ฉันค้นคว้าเกี่ยวกับปัญหานี้และพบว่าโหมด NON IN BOOLEAN ใช้กฎ 50% ซึ่งโดยธรรมชาติแล้วจะไม่สนใจผลลัพธ์จากตารางหนึ่งเมื่อมีความสัมพันธ์ทางคณิตศาสตร์กับผลลัพธ์ 50% ยังคงขอบคุณสำหรับคำแนะนำ แต่ฉันอยากจะได้ยินความคิดอื่น ๆ ขอบคุณอีกครั้ง.
dachints
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.