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ő)
$ 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
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.