Discussion
To find records that contains a particular phrase, youcan’t use a simple FULLTEXT
search:
mysql> -> +----------+| COUNT(*) |+----------+| 548 |+----------+
The query returns a result, but it’s not the resultyou’re looking for. A FULLTEXT
keresés minden egyes szó jelenléte alapján számít relevancia rangsort, függetlenül attól, hogy hol fordul elő a vtext
oszlopban, és a rangsor nem nulla lesz, amíg a szavak bármelyike jelen van. Következésképpen ez a fajta lekérdezés hajlamos túl sok rekordot találni.
A MySQL 4.0.2-től a FULLTEXT
keresés támogatja a kifejezéskeresést Boolean módban. Használatához csak helyezze a kifejezést idézőjelek közé.
mysql> -> +----------+| COUNT(*) |+----------+| 1 |+----------+
A 4.0.2 verzió előtt egy megoldás szükséges. Használhat egyIN
BOOLEAN
MODE
keresést, hogy minden szónak jelen kell lennie,de ez nem igazán oldja meg a problémát, mert a szavak továbbra is bármilyen sorrendben előfordulhatnak:
mysql> -> -> +----------+| COUNT(*) |+----------+| 3 |+----------+
Ha helyette SQL mintaillesztést használ, az a helyes eredményt adja vissza:
mysql> -> +----------+| COUNT(*) |+----------+| 1 |+----------+
Az SQL mintaillesztés használata azonban valószínűleg lassabb, mint egyFULLTEXT
keresés. Úgy tűnik tehát, hogy kellemetlen választása van egy olyan módszer használata között, amely gyorsabb, de nem adja meg a kívánt eredményt, vagy egy olyan, amely megfelelően működik, de lassabb. Szerencsére nem ez az egyetlen lehetőség. Mindkét módszert kombinálhatja ugyanabban a lekérdezésben:
mysql> -> -> +----------+| COUNT(*) |+----------+| 1 |+----------+
Azzal, amit ezzel nyer, az a kétféle megfeleltetés legjobbja:
-
A
MATCH( )
kifejezés használatával a MySQL képes egyFULLTEXT
keresést végrehajtani, hogy olyan jelölt sorokat állítson elő, amelyek tartalmazzák a kifejezésben szereplő szavakat. Ez jelentősen leszűkíti a keresést. -
Az SQL-mintatesztet használva a MySQL a jelölt sorok között csak olyan rekordokat tud keresni, amelyekben az összes szó a megfelelő sorrendben van elrendezve.
Ez a technika sikertelen, ha az összes szó kisebb, mint az indexelőmotor minimális szóhossza, vagy a rekordok több mint felében előfordul. Ebben az esetben a FULLTEXT
keresés egyáltalán nem ad vissza rekordokat. A rekordokat egySQL mintaillesztés segítségével találhatja meg.