Fakadó orosz, a PHP és a MySQL, cikkek, sono
Egyik fontos feladata a helyszínen, hogy megtaláljuk azt a partíciót vagy az egész oldalon. Ez lehetővé teszi a felhasználó számára, hogy gyorsan megtalálja a szükséges információkat. Leggyakrabban ez a probléma megoldható egy teljes szöveges keresés vagy keresési bázis kifejezése során hasonlók. Full-text keresés kényelmes, mert eltolja a kérdést rangsor oldalak relevanciáját az adatbázishoz, akkor kereshet kifejezéseket.
De ugyanakkor ez valamennyire korlátozza, különösen él MyISAM típusú, nem szavakra keresni, kevesebb mint 4-EX karakterek, hozzon létre további indexek. Keresés a LIKE kifejezés kevésbé kényelmes a fejlesztő számára, mivel a lassabb bonyolítja a keresési kifejezéseket. A közös hátránya mindkét megközelítés a lehetetlensége fakadó. Például a katalógus termékek prisutstvet termék „Csokor sárga rózsa”, amikor keresi a kifejezést „vörös rózsa” felhasználó nem fogja látni ezt az elemet az eredményeket. És szeretnék gép egy kicsit megérteni a természetes nyelvet. A probléma megoldására egyszerű PHP és ez segít nekünk phpMorphy. phpMorphy a következő feladatokat látja el:
- Lemmatization (megszerzése szokásos formája a szó)
- Megközelítés minden formája a szó
- Első nyelvtani információk a szót (része a beszéd, az esetben, ragozás, stb)
- Átformálása szó szerint előre meghatározott nyelvtani jellegzetesség
- Formájának megváltoztatása szavak egy adott minta
Támogatja a különböző kódolások:
- az összes egyetlen bájtos (windows-1251, iso-8859- *, stb)
- Unicode kódolások - utf-8, utf-16LE / lenniük, utf-32, UCS2, ucs4.
Meg kell jegyezni, hogy az ezzel a könyvtár jön létre néhány extra szerver terhelés inicializálás közben és működését.
A kezdéshez töltse le a könyvtár fájl, és csomagolja ki, például a „phpmorphy” mappát. Amennyire lehetséges, a könyvtár elérhető webszerver. Ezután töltse le a szótárban egy adott nyelv és karakterkészlet és csomagold ki egy mappát „phpmorphy / dicts” a könyvtár. Inicializálni a könyvtár, csatlakoztassa common.php fájlt a mappában „phpmorphy / src”, és ki beállításokat:
Keresni, akkor használja a következő megközelítés: szót a keresési kifejezést eredményez eredeti formában index tartalom terén is, ami egy pár szót, hogy az eredeti formájában, és attól függően, hogy az ismétlési frekvencia és helyét a szavak - megkérni, súly, stb - keresni indextáblázat keresési kifejezést, és rangsorolja a találatokat súlyát.
Elindításához és az index a tartalom, amely a keresési fog bekövetkezni. Ebben a példában a keresés a színek a katalógusban. Van egy termék azonosítóját, nevét, a rövid és teljes leírását. Kódolás - UTF-8, összeállítása - utf8_bin. Hozzon létre egy táblázatot az árut:
és egy asztal, ahol az index kerül tárolásra:
Itt `word` - kulcsszó,` prod_id` - termék azonosítója, `össztömeg - a tömeg a szavak. Minden bejegyzés jellemzi egyedi pár szót termék.
Ezután fogja az adatbázisból az összes rekordot a vállalatok:
Amikor dolgozik a könyvtárban PhpMorphy szabad elfelejteni, hogy a feltételeket a szótárban tárolja a nagybetű, a kényelem lefordítani tartalom nagybetűvel. Továbbá lehet, hogy megkapja a szót az „e” betű. összegyűjti utf8_bin garantálja számunkra nem járó hibákat egyedi kulcsokat `prod2search` táblázatban. az „e” betű és az „e” nem lesz egy karakter, de ez lesz baj, ha a „zöld” és a „zöld” lesz indexelve külön-külön. Ezért cserélje ki a „e” betű az „e”. A részletes leírás tartalmazhat HTML-címkék őket, nem fogunk index őket, és meg kell megszabadulni.
Itt van egy script, hogy az indexeket termékek és így tovább magyarázatot.
Ez a reguláris kifejezés osztja a tartalmat az egyes szavakat. „U” módosítót használjuk cirill. Emlékeztetni kell arra, hogy az „e” betű nem tartozik a tartományban „az”. A reguláris kifejezés helyesen tudja feldolgozni a következő sort:
Array $ word_pma [1] tartalmaz egy listát az egyes szavakat.
$ alatt azt értjük, Morphy phpMorphy például az osztály. $ Morphy-> lemmatize () eredménye egy szót egy sorban vagy egy sor szó az eredeti alakját, és visszaad egy tömböt a forma „az eredeti szó” => array egy listát a szavak nyelvtani formáját. Alapértelmezett lemmatize () metódus összehasonlítja a szó szótári, negatív eredménnyel próbál alkotnak egy elsődleges a belső szabályok, és ha ez nem sikerül hamis értékkel tér vissza, hanem egy tömb. A mi példánkban csak az orosz szókincs, hanem válassza az angol szavakat. Ezért, ha ez lehetetlen a kiindulási alakzat indexelt bejövő szót:
többször megismételjük a kódot, mert kell, hogy egy másik tömeg szerint, attól függően, hogy a helyét. Címének megfelelően beállítjuk a súlya 3, mondta egy rövid leírást - 2, a teljes - 1. szó- növelje a súlyát.
Ennek eredményeképpen kapunk egy tömböt $ word egy terméket, amely a forma „szó” => „tömeg”. Ezek az adatok kerülnek be egy táblázatot `prod2search`:
A szkript még mindig lehet javítani, például megtiltják az indexelés egyes elöljárók; az index egyes szófajok, például csak a főnevek és melléknevek; zárni a keresési szavakat, amelyek jelen vannak több mint a fele a bejegyzések, például a „leírás” egy teljes leírást az összes tételt, és keresni az adott kulcsszó, és nem jellemző egy adott terméket.
Ez a script lehetővé teszi, hogy a nulla index az összes tartalmat, és csak arra szolgál, mint egy kiegészítő eszköz. Egy valós alkalmazás, akkor index a szöveges tartalmat csak akkor hozzáadni vagy szerkeszteni egy adott rekordot. Indexeléséhez tartalmát használja a fenti szkriptet, de nem fogjuk használni a hurok, és működni fog egy fiókot. A szerkesztéskor előtt ahhoz, hogy az index táblázat `prod2search` vagy eltávolítását áruk - elavult bejegyzések törléséhez:
ahol a $ prod_id - ID szerkeszteni vagy törölni a terméket.
Tudod, hogy optimalizálni. Tegyük fel, amellett, hogy a nevét, rövid leírását és a teljes termék néhány jellemzőit, és szerkesztésekor a felhasználó módosítja csak az ár. Ebben az esetben az indexelt tartalom nem változott, és nem igényel újra indexelés. Ezt el lehet kerülni, hogy összehasonlítjuk a hash indexelt tartalom előtt és után szerkesztése termék. Merge indexelt mezők egy sorban, és szerezzen annak hash keresztül md5 ($ str). További illessze be a kapott érték egy formába, és az adatokat átadó a szerver hash hasonlítson előtt és után a szerkesztést. Ha az összeg egyezik, akkor a tartalom nem változott, és nem igényel újra indexelése azt.
Miután az összes tartalom indexelt és az asztal `prod2search` tele adatokkal, akkor készen áll, hogy végre a keresést.
Nézzük meg a kérést. Mi található a rekord a `prod2search` asztalra. ahol a szavak a szó listája, ahol a keresési kifejezést `s`.`word` IN ( " romolhat (", " $ sql)."). Amikor keres több szót, néhány szóval ugyanaz a termék, annak érdekében, hogy az árut nem duplikált ennek következtében a csoport az eredményeket termékcsoportra `s`.`prod_id`. Ebben az esetben mi adjuk hozzá a tömeg talált szavakat Egyetlen termék SUM ( `össztömeg) AS` weight_sum`. Például keresünk „vörös rózsa” - az áruk, amelyek mindkét szó előfordul a leírásban, a súlya nagyobb, mint a termék egy szót. Mintaeredmények Mi rangsorban relevancia, azaz a tömeg ORDER BY `weight_sum` DESC. Ahhoz, hogy ha keres több szót eredményeként már csak azok az áruk, amelyek megnevezése vannak minden csapdába a keresett szavakat, úgy véljük, hogy hány szót az azonos termék található COUNT ( `s`.`prod_id`) AS` num` és meghatározza azokat a feltételeket RENDELKEZŐ `num` = ".count ($ sql).". Ebben az esetben a realizált logikai „ÉS” összekötő szót a keresési kifejezést, a logikai „VAGY” feltétel lehet kihagyni. Ennek eredményeképpen kapunk egy listát az azonosítók termékek, amelyek illeszkednek a keresési feltételeket. Az egyszerűség kedvéért a felvétel az árut veszünk egy beágyazott lekérdezés, de a gyakorlatban, talán a legjobb megoldás az, ha a termékek listáját az egyes kérésére az azonosítókat. lekérdezési lehetőség a logikai „VAGY” és korlátok sokkal gyorsabban fog futni.
Így a példában már végre egy színes katalógus morfológiai keresésének orosz PHP, MySQL és PhpMorphy. Ez a módszer alkalmazható bármely részén a látogató, és húzza össze, csak azzal, hogy a felhasználó az adatokat, amit keresett.