Calcular pontuações de MATCH () CONTRA () da CONSULTA UNIFICADA, NÃO PARA CADA TABELA

10

Estou tentando obter uma pontuação para a seção inteira das instruções 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')

Nesse caso, as pontuações são por tabela + não são ordenadas por relevância

Mas eu tentei esse método, que está funcionando, mas não vale a pena produzir

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

O código acima não é apreciado porque as pontuações existem por tabela, elas são unidas e ordenadas. Uma péssima abordagem.

Então, eu tentei MATCH() AGAINST()para datano TOP LEVEL SELECT como bem isso. (NÃO TRABALHOU)

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

A declaração acima é perfeita para mim, mas não funciona porque a datacoluna é criada on-the-fly e não suporta ter um ÍNDICE FULLTEXT.

Minha pergunta é como proceder para colocar meu motor em funcionamento.

  • Você pode de alguma forma fazer dataum FULLTEXT
  • Existe alguma maneira de fazê-lo funcionar diferente do IN BOOLEAN MODE que não suporta pontuações
  • Existe uma abordagem para todo esse tópico que o faça funcionar? Criar uma tabela temporária não resolve isso; a regra de 50% de MATCH () AGAINST () faz com que uma consulta retorne 0 resultados, mas há muitos
  • Talvez exista algo que eu sinta falta?
  • Criar uma VIEW também não funciona, o MySQL não suporta INDEX-es em VIEWs.
  • Talvez seja uma boa ideia usar o IN BOOLEAN MODE e criar a pontuação manualmente?

Estou trabalhando para esse problema há mais de dois dias. Por isso, peço ajuda. Obrigado.

dachints
fonte

Respostas:

2

Talvez você possa gravar o seguinte das três (3) tabelas

  • Nome da tabela
  • a coluna do nome da tabela
  • Índice FULLTEXT na coluna

Aqui está o 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;

Agora você pode executar uma única consulta na mesma tabela

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

De uma chance !!!

RolandoMySQLDBA
fonte
Eu fiz algo parecido antes e não funcionou. Este também não funciona. O SELECT final de combinado_dados como good_score com MATCH () e AGAINST () fornece um resultado 0. Eu pesquisei sobre esse problema e descobri que o MODO NÃO NO BOOLEAN aplica a regra de 50%, que por sua natureza ignora os resultados de uma tabela quando há alguma relação matemática com 50% dos resultados. Ainda assim, obrigado pela sugestão, mas gostaria de ouvir algumas outras idéias. Obrigado novamente.
dachints