MATCH () AGAINST () स्कोर UNIFIED QUERY से EACH TABLE के लिए नहीं


10

मैं सेलेक्ट स्टेटमेंट्स के पूरे सेक्शन के लिए स्कोर बनाने की कोशिश कर रहा हूं

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()लिए dataTOP LEVEL SELECT में भी प्रयास किया। (DIDN'T WORK)

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कॉलम ऑन-द-फ्लाई बनाया गया है और यह फुलटैक्स INDEX का समर्थन नहीं करता है।

मेरा सवाल यह है कि अपने इंजन को काम करने के लिए कैसे आगे बढ़ाया जाए।

  • क्या आप किसी तरह dataफुलटेक्स्ट बना सकते हैं
  • क्या इसमें BOOLEAN MODE के अलावा अन्य काम करने का कोई तरीका है जो स्कोर का समर्थन नहीं करता है
  • क्या इस पूरे विषय के लिए एक दृष्टिकोण है जो इसे काम करेगा? एक अस्थायी तालिका बनाने से यह हल नहीं होता है, MATCH का 50% नियम () AGAINST () क्वेरी रिटर्न 0 परिणाम देता है, लेकिन कई हैं
  • शायद वहाँ कुछ है जो मुझे याद है?
  • VIEW बनाना या तो काम नहीं करता है, MySQL, VIEWs पर INDEX-es का समर्थन नहीं करता है।
  • शायद यह BOOLEAN MODE में उपयोग करने और मैन्युअल रूप से स्कोरिंग बनाने के लिए एक अच्छा विचार है?

मैं इस मुद्दे पर दो दिनों से अधिक समय से काम कर रहा हूं। इसलिए मैं आपसे कुछ मदद माँगता हूँ। धन्यवाद।

जवाबों:


2

शायद आप तीन (3) तालिकाओं से निम्नलिखित रिकॉर्ड कर सकते हैं

  • तालिका नाम
  • तालिका नाम से स्तंभ
  • स्तंभ पर पूर्णांक सूचकांक

यहाँ कोड है:

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;

कोशिश करो !!!


मैंने पहले भी इसी तरह का काम किया है और यह काम नहीं किया। यह एक भी काम नहीं करता है। MAT_ () और AGAINST () के साथ good_score के रूप में संयुक्त_डेटा से अंतिम चयन एक 0 परिणाम देता है। मैंने इस मुद्दे के बारे में शोध किया और पाया कि नॉन इन बोयोलान मोड 50% नियम लागू करता है, जो अपनी प्रकृति से किसी भी तरह एक तालिका से परिणाम की उपेक्षा करता है जब 50% परिणामों के साथ कुछ गणितीय संबंध होता है। फिर भी, सुझाव के लिए धन्यवाद, लेकिन मैं कुछ अन्य विचार सुनना चाहूंगा। एक बार फिर धन्यवाद।
दशांश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.