Wyszukiwanie pełnotekstowe nie działa tak, jak chcę, i nie rozumiem różnic w listach wyników.
Przykładowe instrukcje:
SELECT `meldungstext`
FROM `artikel`
WHERE `meldungstext` LIKE '%punkt%'
zwraca 92 wiersze. Otrzymuję wiersze, które pasują do siebie, na przykład „Punkten”, „Zwei-Punkte-Vorsprung” i „Treffpunkt” w kolumnie meldungstext.
Ustawiłem indeks pełnotekstowy w kolumnie „meldungstext” i spróbowałem:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*')
zwraca to tylko 8 wierszy. Otrzymuję tylko wiersze, które pasują do samego „Punktu” lub słowa, które moim zdaniem są traktowane jako „Punkt” jak w „i-Punk”.
Następnie wypróbowałem tryb logiczny:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*' IN BOOLEAN MODE)
zwraca 44 wiersze. Otrzymuję wiersze, które mają „Zwei-Punkte-Vorsprung” lub „Treffpunkt” w kolumnie meldungstext, ale nie te z „Punkten”.
Dlaczego tak się dzieje i jak ustawić „w pełni działające” wyszukiwanie pełnotekstowe, aby zapobiec użyciu LIKE „%%” w klauzuli where?
źródło
Odpowiedzi:
Wziąłem trzy ciągi z twojego pytania i dodałem je do tabeli plus trzy kolejne z
pankt
zamiastpunkt
.Poniższe czynności zostały wykonane przy użyciu MySQL 5.5.12 dla systemu Windows
Uruchomiłem te zapytania do tabeli przy użyciu 3 różnych podejść
MATCH ... AGAINST
LOCATE
jak w funkcji LOCATELIKE
Zwróć uwagę na różnice
Wszystkie wartości PunktMatch powinny być równe 3 1 i 3 0.
Teraz patrz, jak pytam o nie jak zwykle
OK przy użyciu funkcji PODAJ. PONOWNIE z punktem nie działa. A co z panktem ???
GROUP BY
Uruchommy moje duże zapytanie przeciwko panktJest to również złe, ponieważ powinienem zobaczyć 3 0 i 3 1 dla PanktMatch.
Próbowałem czegoś innego
Dodałem znak plus do pankt i uzyskałem różne wyniki. Co 2, a nie 3 ???
Zgodnie z Dokumentacją MySQL zwróć uwagę na to, co mówi o znaku wieloznacznym:
Na tej podstawie znak wieloznaczny ma zastosowanie do tyłu znaczników, a nie do przodu. W świetle tego wynik musi być poprawny, ponieważ 2 z 3 żetonów początkowych punktu. Ta sama historia z panktem. To przynajmniej wyjaśnia, dlaczego 2 z 3 i dlaczego mniej wierszy.
źródło
COUNT(IF(MATCH
zapytaniu „Pankten” .COUNT(…)
w kolumnach PunktMatch i PanktMatch?COUNT(IF(MATCH (
meldungstext zawsze) AGAINST ('*pankt*' IN BOOLEAN MODE),1,0))
będzie skutkować , ponieważ się liczy lub wynik z .1
1
0
IF(…)