Calcule las puntuaciones de MATCH () CONTRA () a partir de CONSULTA UNIFICADA, NO PARA CADA TABLA

10

Estoy tratando de obtener una puntuación para la sección completa de las declaraciones 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')

En tal caso, los puntajes son por tabla + no están ordenados por relevancia

Pero probé este método, que funciona pero no vale la pena producir

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

El código anterior no le gusta porque hay puntuaciones por tabla, se unen y se ordenan. Un mal enfoque.

Así que traté MATCH() AGAINST()de dataen NIVEL SUPERIOR SELECT, así esto. (NO TRABAJÓ)

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

La declaración anterior es perfecta para mí, pero no funciona porque la datacolumna se crea sobre la marcha y no admite tener un ÍNDICE FULLTEXT.

Mi pregunta es cómo proceder para que mi motor funcione.

  • ¿Puedes de alguna manera hacer dataun FULLTEXT?
  • ¿Hay alguna manera de hacerlo funcionar que no sea IN BOOLEAN MODE que no sea compatible con los puntajes?
  • ¿Existe un enfoque para todo este tema que lo haga funcionar? Crear una tabla temporal no resuelve esto, la regla del 50% de MATCH () AGAINST () hace que una consulta devuelva 0 resultados, pero hay muchos
  • Tal vez hay algo poco que extraño?
  • La creación de un VIEW tampoco funciona, MySQL no es compatible con INDEX-es en los VIEW.
  • ¿Quizás sea una buena idea usar IN BOOLEAN MODE y crear una puntuación manualmente?

He estado trabajando para este problema por más de dos días. Así que le pido amablemente ayuda. Gracias.

dachints
fuente

Respuestas:

2

Quizás podría registrar lo siguiente de las tres (3) tablas

  • nombre de la tabla
  • la columna del nombre de la tabla
  • Índice FULLTEXT en la columna

Aquí está el código:

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;

Ahora puede ejecutar una sola consulta en una tabla

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

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
He hecho algo similar antes y no funcionó. Este tampoco funciona. El SELECT final de combina_data como good_score con MATCH () y AGAINST () da un resultado de 0. Investigué sobre este tema y descubrí que NON IN BOOLEAN MODE aplica la regla del 50%, que por su naturaleza ignora los resultados de una tabla cuando hay alguna relación matemática con el 50% de los resultados. Aún así, gracias por su sugerencia, pero me gustaría escuchar algunas otras ideas. Gracias de nuevo.
dachints