Рассчитать MATCH () ПРОТИВ () баллов по UNIFIED 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в 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 () AGAINST () делает запрос, возвращающий 0 результатов, но их много
  • Может быть, есть кое-что, что я скучаю?
  • Создание VIEW также не работает, MySQL не поддерживает INDEX-es для VIEW.
  • Может быть, это хорошая идея использовать IN BOOLEAN MODE и создавать оценки вручную?

Я работаю над этим вопросом более двух дней. Поэтому я прошу помощи. Спасибо.

dachints
источник

Ответы:

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;

Попробуйте!

RolandoMySQLDBA
источник
Я делал подобное раньше, и это не сработало. Этот тоже не работает. Окончательный SELECT из комбинированных данных как good_score с MATCH () и AGAINST () дает 0 результатов. Я исследовал эту проблему и обнаружил, что NON IN BOOLEAN MODE применяет правило 50%, которое по своей природе каким-то образом игнорирует результаты из одной таблицы, когда существует некоторая математическая связь с 50% результатов. Тем не менее, спасибо за предложение, но я хотел бы услышать некоторые другие идеи. Еще раз спасибо.
Дачинтс