Biztonságos és kényelmes keresésének mysql

Rövid tájékoztatást a végrehajtás a keresés: feidoigozósoroktói vágás szolgáltatás mutatók összeállítása egy lekérdezést az adatbázis, logika, oldalszámozás, jelentősége.

1. rész: Általános adatok

Az első lépés az, hogy csökkentsék a húr kezeli.

$ Search = substr ($ kereső, 0, 64);

64 karakter felhasználó lesz elegendő a keresést. Most forró vas égett az összes „abnormális” karaktert.

$ Search = preg_replace ( "/ [^ \ w \ x7F- \ xff \ s] /", "", $ search);

Az ötlet az, hogy nem tud adni a felhasználó számára lehetővé, hogy nézd meg túl rövid szó - többek között ez sokkal a kiszolgáló terhelését. Nos, nézzük csak a keresést a szavakat, amelyek több mint két betű (ha van újabb, ki kell cserélni „” A „”).

$ Good = trim (preg_replace ( "/ \ s (\ S) \ s /", "", ereg_replace ( "+", "", "$ keresni")));

És csere után rossz szó - meg kell tömöríteni a kettős terek (ők kimondottan a megfelelő keresési rövid szó).

$ Good = ereg_eplace ( "+", "", $ jó);

Tegyük fel, hogy szeretné, hogy a felhasználó választhat a keresési logika - kíván minden szó, vagy csak egy a sok. Ha azt szeretnénk, hogy itt Yandex - két-jel azt jelenti, „I” (slovo1slovo2slovo3) vagy valami más, nem vagyok tanácsadó. A sámánizmus a húrok egy kis site imho nem indokolja az időt. Ezért a keresőmezőbe felhívni a következők szerint:

És a keresési script ismét ellenőrzi, hogy a felhasználó által bevitt:

Mivel a logika azt kell használni - az alábbiakban.

Egy jó ötlet, hogy haladéktalanul tájékoztatja a felhasználót arról, hogy megtalálta a táblázat sorait. Ehhez, hogy további kérelmet az adatbázisban:

$ Query = "SELECT id FROM asztal, ahol a mező LIKE„%". str_replace ( "", "% 'OR mező LIKE' %", $ jó). "%„";

A statisztikai Egyetlen szóval a következőket teheti:

lapozott eredmények

Nos, amikor meg kell keresni az elrendezés és a sorok számát a keresési eredmény, nem lapozott keresés - egy szelet tortát. Ellenőrizze a változó $ lap (nem kevesebb, mint 0, nem több, mint $ results_amount / $ rows_in_page) .A kérelem, amely számolja a sorok számát (lásd fent), írunk a kívánt mezőt és a helyszíni válogatás. És akkor befejezi

(Syntax: LIMIT <кол-во строк> vagy LIMIT <кол-во строк отступа>, <кол-во строк>)

Ennek eredményeként az ilyen kérés, mi lesz pontosan ugyanezen vonalak, amelyek meg kell jelennie a navigációs stranitse.Dlya lehet akár felhívni linkek az előző és következő oldalakon, vagy azt, hogy sokkal nehezebb csinálni egy navigációs sáv néhány oldalt.

Ahhoz, hogy a megvilágító fény vagy félkövér betűtípussal keresési kifejezéseket a szövegben, azt kell csinálni, hogy csak:

Hiányosságok (és azok a szavak között önálló, és sehol dupla helyet nem található, sőt, a végén a húr, vágjuk őket is), elég cserélni a függőleges vonal - lehetőség elválasztó reguláris kifejezések. A „rossz” szóval, nincsenek kiemelve, mert nem keresik a saját bázis :). A kód, amely a szöveget írunk:

Írása után a kérdés futottam, azt írásban is, és „megvilágítás”. Nem egy kicsit belőle! Úgy találtam a szövegben HTML, ezért kellett sokat gondolkodni. Az eredmény egy olyan dolog (a húr a szavak kiemelése):

Látnunk kell, hogy van-e szó, a címkét. Ugyanakkor felmerül a probléma, az erőforrás-intenzitása az ilyen csere (én K6-266 a szöveget 5 kilobájt gondolta hét másodperc). Sajnos.

Alkalmazásával ezeket a technikákat, lehetséges, egyrészt, hogy korlátozza a szabadságot a felhasználó intézkedéseket, és nem ad neki a) tanulni a használt szoftver a site felépítése) ok szerver túlterhelés (pl küldött megabyte szövegének álló szó hosszúságú a három betű (a kifejezés vált kétértelmű, de átírni nem teszem :), a forgatókönyvet 250000 alkalommal mászni a bázis) c) hibaüzenetet lát eredményeként belépő speciális karakterre lekérdező nyelvet. Másodszor, a felhasználói élmény - lapszámozás és a fények.

Emlékszem, a cikk „Biztonságos és kényelmes keresési” ezt a kifejezést

2. rész rövid relevánsak

Ahhoz, hogy megjelenjen a keresési eredmények fontosság szerint határozzon:

  • Kötelező mezők VARCHAR, vagy a fajták szöveges mezők (SMALLTEXT, MEDIUMTEXT stb) do kulcsok Kulcsszó:

ALTER TABLE ADD FULLTEXT (mező)

  • Next - még egyszerűbb:

    $ Query = "SELECT *, MATCH mező ELLEN ( '$ SearchWords) mint relev táblázatból ORDER BY relev DESC"

    Akkor tegye mindenféle LIMIT'y és így könnyen kimenet.

    • Alapértelmezésben a keresést szavak, amelyek legalább 4 karakter. Szabályok beállítása #define MIN_WORD_LEN 4 forrás ft_static.c, bár a szabályok, nem kell, hogy az én véleményem.
    • % Rendelkezésre álló karakterek a keresési kifejezést, szót a keresési kifejezést elemzett segítségével razdeleteley listából.
    • A szavak listáját a forrás elválasztó jogok ft_static.c.
    • A legalább tíz rekordok egy táblázat számítás indításához a jelentősége.
    • Nem lehet használni a területen relev záradékot, ha:

    SELECT *, MATCH mező ELLEN ( '$ SearchWords) mint relev táblázatból WHERE relev> 0 ORDER BY DESC relev

    SELECT *, MATCH mező ELLEN ( '$ SearchWords) mint relev táblázatból HOL MATCH területén ELLEN ( '$ SearchWords')> 0 ORDER BY DESC relev

  • elegendően nagy sebességgel - akár bizonyos esetekben gyorsabb keresés, mint a
  • Az összes fenti munkák verzió óta MySQL 3.23.23
  • Létrehozásakor FULLTEXT indexek több mező van 2 lehetőség:

    Az első esetben kérheti:

    SELECT *, MATCH field1, field2 ELLEN ( '$ SearchWords) mint relev táblázatból ORDER BY DESC relev

    vonatkozású kiszámítása minden területen egyszerre. A második esetben, az ilyen kérelmet hibát generál. Itt kiszámíthatja a jelentősége a következő:

    SELECT *, MATCH field1 ELLEN ( '$ SearchWords) + MATCH field2 ELLEN (' $ SearchWords) mint relev táblázatból ORDER BY DESC relev

    A második lehetőség valamivel bonyolultabb a kéréseket, de véleményem szerint jobb, mert növekvő keresési rugalmasság - az egyes területeken lehet állítani, például a jelentősége a koefficiens és az összegzés területén érintettség szorozza őket ezzel a tényezővel. Keresés kifejezés a „hosszabb” Keresés területeken magas együtthatóval. Például, ha azt nem a keresés az indexelt oldal erőforrás könyvtár, az oldal neve mező beállítása általában egy nagyobb tényező, mint a mező meta tagek leírások, illetve kulcsszavak.

    3. rész: Gyakorlatok c vonatkozás

    Először is, hogyan kell hozzáadni FULLTEXT-index:

    Text-indexek lehet tenni csak a MyISAM típusát. A szövegeket venni az asztalról, és ledobta az index fájl és egy folyamatosan bővülő kötetet. Kérelmekkel kapcsolatos. Nem lehet használni a területen relev záradékot, ha:

    SELECT *, MATCH mező ELLEN ( '$ SearchWords) mint relev táblázatból WHERE relev> 0 ORDER BY DESC relev

    SELECT *, MATCH mező ELLEN ( '$ SearchWords) mint relev táblázatból HOL MATCH területén ELLEN ( '$ SearchWords')> 0 ORDER BY DESC relev

    A számított mező természetesen nem lehet használni a WHERE minden szabályát szintaxis, de fel lehet használni a következőkkel:

    SELECT *, MATCH mező ELLEN ( '$ SearchWords) mint relev táblázatból RENDELKEZŐ relev> 0 ORDER BY DESC relev

    Keresés a MATCH, Oleg írt csak akkor történik meg a teljes szót. Azonban fontosság szerint csak akkor lehet válogatni és rendezve LIKE (ez természetesen hatással lesz a teljesítmény, nem tudom, hogyan).

    Távolítsuk el a feltétel „relev> 0”, így a válogatás. Más, mint korábban - kapott karaj vonal és átalakítani a lekérdezés több szereplők, mint például:

    SELECT *, MATCH mező ELLEN ( '$ SearchWords) AS relev táblázatból WHERE mező LIKE '% $ word1%' OR területen, mint a '% $ word2%' ORDER BY relev DESC, datefield DESC

    4. rész: Prodolezhenie indított

    MySQL a legújabb változata a használt adatbázis teljes szöveges keresés indexelést és szerkezete FULLTEXT MATCH területén ELLEN. Azonban nem minden szerver kell a legújabb verzióját a MySQL, és nem minden tárhely szolgáltatók szeretné frissíteni a szoftvert okokból a rendszer megbízhatóságát.

    Abban az időben, azt feltételezzük, hogy a kereső, fontossági sorrend szerint rendezve kell végeznie néhány vizsgálatot, és ezért jobb, ha nem vállalja azt. Gondolat, hogy vonatkozású számíthat rám távolról kérésére a látogató, de féltem, és hogy egy ilyen szerkezet.

    Azonban a munkavállaló egyik cégek saytostroitelnyh H-ska dicsekedett találom a rendszert, hogy az általuk használt saját telek. Nem emlékszem pontosan a kérést, így próbálja játszani:

    SELECT cím, DATE_FORMAT (material_date, '% E.% C% Y') AS dátum1, IF (szöveg, mint a '% szó1 szó2 word3%', 3 * 10, 0) + HA (szöveget, mint a '% word1%', 9, 0) + HA (szöveg LIKE '% word2%', 9, 0) + HA (szöveg LIKE '% word3%', 9, 0) AS-vonatkozású táblázatból, ahol szöveg LIKE '% word1%' OR szöveget, mint a ' % word2% 'OR szöveg LIKE' % word3% „ORDER BY vonatkozású DESC, material_date DESC

    Szörnyen néz ki, de működik még a régebbi verziói MySQL. Próbáltam összehasonlítani a sebesség egy lekérdezés, mint ez:

    SELECT cím, DATE_FORMAT (material_date, '% E.% C% Y') AS dátum1, MATCH szöveges ELLENI ( 'szó1 szó2 word3') AS-vonatkozású táblázatból, ahol szöveg MINT '% word1%' vagy szöveges MINT „% word2% 'vagy szöveges LIKE' % word3% „ORDER BY vonatkozású DESC, material_date DESC

    Átlagosan általános lekérdezés sebessége kétszer kisebb az új design. Ami elég logikus - a nagyobb rugalmasság, a nagyobb erőforrás intenzitását.

    Próbáljuk építeni egy ilyen kérés automatikusan. Vágjuk a hosszú sorban, valamint minden rossz szimbólumokat és rövid szavakat. Döntetlen kérelmet.

    $ Query = "SELECT cím, DATE_FORMAT (material_date, '% E.% C% Y') AS dátum1, IF (szöveg, mint a '%". $ Good_words. "%',". (Substr_count ($ good_words, "" ) + 1). "* 10, 0) + HA (szöveget, mint a„%". str_replace ( "", "% '9, 0) + HA (szöveget, mint a' %", $ good_words).„%”, 9, 0) AS-vonatkozású táblázatból, ahol szöveg LIKE „%." str_replace ( "", "% 'vagy szöveges LIKE' %", $ good_words). "%„ORDER BY vonatkozású DESC, material_date DESC";

    Nem nagyon nehéz. A megbízhatóság és az árvízvédelem, akkor korlátozza a szavak száma a lekérdezésben.

    Néhány kiegészítés az előző kiadványok

    Az összes mérkőzés a táblázatban található. Keresési eredmények megjelenítéséhez természetesen szükséges, hogy egy LIMIT záradékot (ne írjon minden alkalommal a kialakulását ez a paraméter, akkor az előre meghatározott funkciók). Ha nincs csoportosítás műveleteket a kérelmet nem, akkor jobb, ha számít a sorok számát egyszerre egy lekérdezést - COUNT (*), de nem a php mysql_num_rows () függvényt. Meg tudja nézni a nagy asztal. Ha a csoport műveletet végeznek, hogy a kérelmet a COUNT (DISTINCT (<поле, по которому группируем>)), De anélkül, hogy a GROUP BY.

    Háttérvilágítást. Kivéve, ha a szöveg html-címkék, akkor könnyebb élni

    $ Text = preg_replace ( "/ word1 | word2 | word3 / i", "\\ 0”$ Text);

    Ha a szöveg címkéket használnak, akkor három lehetőség van a) nem, hogy a háttérvilágítás b), mert a felhasználó nem látja a címkét (kivéve, ha ez egy nagyon kíváncsi felhasználó), akkor lehet, hogy egy index területen, ahol nem lesz címkék és jelek [^ \ w \ x7F- \ xff \ s] fogja helyettesíteni terek (ezek a karakterek vannak vágva a keresőmezőbe a legelején, hogy a keresés a számukra nem kerül sor). Keresés és világítás ebben az esetben az, hogy az index. c) ne jelölje ki a szöveget a megszokott területeken, előre vágott címkék srip_tags () függvényt.

    Teljes verzió a kód kereső, mint mindig, a fájl listában.