প্রতি টেবিলের জন্য নয় ইউনিফাইড QUERY এর থেকে ম্যাচ () পুনরায় () স্কোর গণনা করুন


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

এই জাতীয় ক্ষেত্রে স্কোরগুলি টেবিল প্রতি + হয় তবে এগুলি প্রাসঙ্গিকতার দ্বারা অর্ডার করা হয় না

তবে আমি এই পদ্ধতিটি চেষ্টা করেছিলাম, যা কাজ করছে তবে উত্পাদন যোগ্য নয় is

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কলাম অন-ফ্লাই তৈরি করা হয়েছে এবং এটি ফুলটেক্সট সূচকটি সমর্থন করে না।

আমার প্রশ্নটি হল কীভাবে আমার ইঞ্জিনটি কাজ করতে এগিয়ে যায়।

  • আপনি কি কোনওভাবে dataপুরোপুরি তৈরি করতে পারেন?
  • এটি বুলিয়ান মোড যা স্কোরকে সমর্থন করে না other
  • এই পুরো বিষয়টিতে এমন কোনও দৃষ্টিভঙ্গি রয়েছে যা এটি কার্যকর করবে? একটি অস্থায়ী টেবিল তৈরি করা এটি সমাধান করে না, ম্যাচের 50% নিয়ম () AGINST () এর পরে একটি কোয়েরি 0 ফলাফল দেয় তবে অনেকগুলি রয়েছে
  • কিছু একটা আছে যা আমি মিস করছি?
  • একটি ভিউ তৈরি করা কোনওভাবেই কাজ করে না, মাইএসকিউএল VIEWs- এ INDEX-es সমর্থন করে না।
  • বুলিয়ান মোডে ব্যবহার করা এবং ম্যানুয়ালি স্কোরিং তৈরি করা ভাল ধারণা?

আমি এই ইস্যুটির জন্য দুই দিনেরও বেশি সময় ধরে কাজ করছি। তাই আমি দয়া করে কিছু সাহায্যের জন্য বলছি। ধন্যবাদ।

উত্তর:


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;

একবার চেষ্টা করে দেখো !!!


আমি আগেও একই কাজ করেছি এবং এটি কার্যকর হয়নি। এই এক কাজ করে না। ম্যাচ () এবং আবার () এর সাথে সম্মিলিত_ডেটাকে শুভ_স্কোর হিসাবে চূড়ান্ত নির্বাচন করুন 0 ফলাফল দেয়। আমি এই সমস্যাটি নিয়ে গবেষণা করেছি এবং জানতে পেরেছি যে কোন বুলিয়ান মোডে 50% বিধি প্রয়োগ করা হয়, যখন 50% ফলাফলের সাথে কিছু গাণিতিক সম্পর্ক থাকে তখন তার প্রকৃতির দ্বারা কোনওভাবে একটি টেবিল থেকে ফলাফল উপেক্ষা করা হয়। তবুও, আপনাকে পরামর্শের জন্য ধন্যবাদ, তবে আমি আরও কিছু ধারণা শুনতে চাই। আবার ধন্যবাদ.
ডিসিঙ্কস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.