Oblicz wyniki MATCH () AGAINST () z UNIFIED QUERY nie dla KAŻDEJ TABELI

10

Próbuję uzyskać wynik dla całej sekcji instrukcji 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')

W takim przypadku wyniki są na tabelę + nie są uporządkowane według trafności

Ale wypróbowałem tę metodę, która działa, ale nie jest warta produkcji

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

Powyższy kod nie jest lubiany, ponieważ wyniki są na tabelę, są łączone i porządkowane. Złe podejście.

Więc starałem się MATCH() AGAINST()za dataw najwyższym poziomie SELECT jak dobrze to. (NIE DZIAŁA)

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

Powyższa instrukcja jest dla mnie idealna, ale nie działa, ponieważ datakolumna jest tworzona w locie i nie obsługuje INDEKSU PEŁNOTEKSTOWEGO.

Moje pytanie brzmi, jak przejść do uruchomienia silnika.

  • Czy możesz w jakiś sposób zrobić dataPEŁNY TEKST
  • Czy istnieje inny sposób, aby działał inaczej niż W TRYBIE BOOLEAN, który nie obsługuje wyników
  • Czy istnieje podejście do tego całego tematu, które sprawi, że zadziała? Utworzenie tabeli tymczasowej nie rozwiązuje tego, 50% reguła MATCH () AGAINST () powoduje, że zapytanie zwraca 0 wyników, ale istnieje wiele
  • Może jest coś, za czym tęsknię?
  • Tworzenie VIEW również nie działa, MySQL nie obsługuje INDEKSÓW na VIEW.
  • Może dobrym pomysłem jest użycie IN BOOLEAN MODE i ręczne tworzenie punktów?

Pracowałem nad tym problemem od ponad dwóch dni. Dlatego uprzejmie proszę o pomoc. Dzięki.

dachówki
źródło

Odpowiedzi:

2

Być może mógłbyś zapisać następujące z trzech (3) tabel

  • Nazwa tabeli
  • kolumna od nazwy tabeli
  • Indeks FULLTEXT w kolumnie

Oto kod:

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;

Teraz możesz uruchomić jedno zapytanie dla jednej tabeli

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

Spróbuj !!!

RolandoMySQLDBA
źródło
Robiłem wcześniej podobne rzeczy i to nie działało. Ten też nie działa. Końcowy WYBÓR z kombinacji danych_danych jako good_score z MATCH () i AGAINST () daje wynik 0. Badałem ten problem i dowiedziałem się, że NON IN BOOLEAN MODE stosuje zasadę 50%, która ze swej natury w jakiś sposób ignoruje wyniki z jednej tabeli, gdy istnieje jakiś związek matematyczny z 50% wyników. Mimo to dziękuję za sugestie, ale chciałbym usłyszeć inne pomysły. Dzięki jeszcze raz.
dachówki