Utwórz trzy indeksy pełnotekstowe
- a) jeden w kolumnie słów kluczowych
- b) jeden w kolumnie treści
- c) po jednym w kolumnie słów kluczowych i treści
Następnie Twoje zapytanie:
SELECT id, keyword, content,
MATCH (keyword) AGAINST ('watermelon') AS rel1,
MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2) DESC
Chodzi o to, że rel1
zapewnia trafność zapytania tylko w keyword
kolumna (ponieważ utworzyłeś indeks tylko w tej kolumnie). rel2
robi to samo, ale dla content
kolumna. Możesz teraz dodać te dwie oceny trafności razem, stosując dowolną wagę.
Jednak nie używasz żadnego z tych dwóch indeksów do rzeczywistego wyszukiwania. W tym celu użyj trzeciego indeksu, który znajduje się w obu kolumnach.
Indeks (słowo kluczowe, treść) kontroluje przywoływanie. Aka, co jest zwracane.
Dwa oddzielne indeksy (jeden tylko dla słowa kluczowego, drugi tylko dla treści) kontrolują trafność. Tutaj możesz zastosować własne kryteria ważenia.
Zwróć uwagę, że możesz użyć dowolnej liczby różnych indeksów (lub zmieniać indeksy i wagi używane w czasie zapytania w oparciu o inne czynniki, być może ... szukaj słowa kluczowego tylko wtedy, gdy zapytanie zawiera słowo stopu ... zmniejsz obciążenie wagowe dla słowa kluczowe, jeśli zapytanie zawiera więcej niż 3 słowa... itd.
Każdy indeks zajmuje miejsce na dysku, więc więcej indeksów, więcej dysku. I z kolei większy ślad pamięci dla mysql. Ponadto wstawianie zajmie więcej czasu, ponieważ masz więcej indeksów do zaktualizowania.
Powinieneś porównywać wydajność (uważając, aby wyłączyć pamięć podręczną zapytań mysql w celu przeprowadzenia testów porównawczych, w przeciwnym razie wyniki będą przekrzywione) w swojej sytuacji. To nie jest wydajne w Google, ale jest dość łatwe i „niestandardowe” i prawie na pewno jest o wiele lepsze niż użycie „lubię to” w zapytaniach.
Uważam, że to działa naprawdę dobrze.