MySQL Cookbook by

Discussion

To find records that contains a particular phrase, youcan’t use a simple FULLTEXTsearch:

mysql>  -> +----------+| COUNT(*) |+----------+| 548 |+----------+

The query returns a result, but it’s not the resultyou’re looking for. A FULLTEXTkeresé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 FULLTEXTkeresé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 BOOLEANMODE 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 FULLTEXTkeresés egyáltalán nem ad vissza rekordokat. A rekordokat egySQL mintaillesztés segítségével találhatja meg.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.