Обчисліть показники МАТЧ () ПРОТИ () з ЄДНОВОГО ЗАПИТАННЯ ДЛЯ КОЖНОГО СТОЛУ


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в TOP LEVEL SELECT , а це. (НЕ РОБОТИ)

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.

Моє запитання - як продовжувати роботу мотора.

  • Чи можете ви якось скласти dataФУЛЬТЕКСТ
  • Чи є якийсь спосіб змусити його працювати, крім IN BOOLEAN MODE, який не підтримує балів
  • Чи є підхід до всієї цієї теми, який би змусив її працювати? Створення тимчасової таблиці це не вирішує, 50% правило MATCH () ПРОТИ () робить запит поверненням 0 результатів, але їх багато
  • Можливо, є щось мало, що я сумую?
  • Створення VIEW також не працює, MySQL не підтримує INDEX-і на VIEW.
  • Можливо, це гарна ідея використовувати В БУЛЬСЬКИЙ РЕЖИМ і створити підрахунок вручну?

Я працюю над цим питанням більше двох днів. Тому я люб'язно прошу допомогу. Дякую.

Відповіді:


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 з комбінованих_даних як good_score з MATCH () та ПРОТИ () дає результат 0. Я дослідив цю проблему і з’ясував, що NON IN BOOLEAN MODE застосовує правило 50%, яке за своєю природою якось ігнорує результати з однієї таблиці, коли є якесь математичне відношення з 50% результатів. Все-таки дякую за пропозицію, але хотілося б почути ще деякі ідеї. Знову дякую.
дачі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.