


Eingehende Untersuchung von Keyword-Matching-Projekten (2) – Einführung der Idee von Untertabellen
Aug 08, 2016 am 09:31 AM(2) Einführung der Idee der Untertabelle
Neueste Artikel: 1) Architekturanwendung der gleichzeitigen Datenerfassung (Redis-Anwendung)
2) Hochverfügbare Datenerfassungsplattform (wie man PHP .net AAuto in 3 Sprachen verwendet)
Die schrittweise Einführung in das Keyword-Matching-Projekt ist im Wesentlichen abgeschlossen. Eine eingehende Untersuchung besteht darin, die Leistung des Systems zu analysieren und einige Änderungen vorzunehmen, die unter Berücksichtigung einiger Umgebungen vorgenommen werden müssen.
Lernen Sie Schritt für Schritt, wie Sie ein Keyword-Matching-Projekt durchführen: Bringen Sie Ihnen Schritt für Schritt bei, wie Sie ein Keyword-Matching-Projekt (Suchmaschine) durchführen ---- Tag 1 ~ Bringen Sie Ihnen Schritt für Schritt bei, wie Sie ein Keyword-Matching durchführen Projekt (Suchmaschine) ---- Zweite Zwölf Tage (insgesamt 22 Artikel)
Eingehende Recherche: Im vorherigen Abschnitt ging es um eingehende Recherche zu Keyword-Matching-Projekten – die Einführung von Filtern.
Jeder Artikel wird in die Ursachen des Problems, Lösungen und einige notwendige Umsetzungspläne unterteilt.
Der Haupttext dieses Artikels beginnt offiziell.
Ursache des Problems
Mit dem explosionsartigen Wachstum der automatisch erfassten Daten steigt die Kapazität des Lexikons von ein paar Watt Daten auf Millionen von Daten. Xiao Shuaishuai fühlt sich beim Betrachten der Abfragen in der Datenbank immer machtloser.
Außerdem sagt Xiao Ding Ding am häufigsten zu Xiao Shuai Shuai: Wann kann ich so schnell Wörter auswählen? Jedes Mal, wenn ich lange warte und keine Antwort kommt, habe ich wirklich Todesangst.
Der kleine Hübsche ist auch relativ ängstlich und mein Herz ist abgemagert. Ich habe wirklich das Gefühl, dass dies die Herausforderung ist. Xiao Shuaishuai hatte keine andere Wahl, als weiterhin nach dem Chef zu suchen und ihn zu bitten, ihn mit einem cleveren Trick zu belohnen.
Chef Yu klopfte Xiao Shuaishuai auf die Schulter: Junger Mann, Sie wissen, wie schwierig das Projekt ist!
Xiao Shuaishuai antwortete: Machen Sie sich nicht lächerlich über mich, ich habe es zutiefst gespürt und ich glaube, mein Herz kann es vielleicht nicht ertragen.
Boss Yu: Wenn Sie das nicht ertragen können, wird es in Zukunft wohl noch mehr für Sie geben.
Kleiner Hübscher: Großer Bruder, ganz zu schweigen von diesen virtuellen Verhaltensweisen, beeilen Sie sich mit der Lösung.
Boss Yu: Warum hast du es eilig? Komm her und ich gebe dir den Weg frei.
„Hat jedes Baby ein Kategorieattribut? Wie viele Wörter in diesen Millionen Daten gehören wirklich zu dieser Kategorie? Kann unser Projekt weiterhin stabil sein?“
Lösung
Entsprechend bestimmten Geschäftsanforderungen können wir die Datentabelle vertikal oder horizontal aufteilen, wodurch die Leistung effektiv optimiert werden kann.
Die vertikale Segmentierung wird auch als Spaltensegmentierung bezeichnet. Sie teilt ungewöhnliche Spalten oder lange Felder auf, um sicherzustellen, dass sich die gemeinsamen Entitäten in einem relativ anwendbaren Zustand befinden.
Bei der horizontalen Aufteilung, auch Zeilenaufteilung genannt, werden Datensätze nach einem bestimmten Unternehmen aufgeteilt und in verschiedenen Tabellen gespeichert. Zu den üblichen Tabellenaufteilungsvorgängen gehört auch die Datumsaufteilung.
In diesem Fall wird die horizontale Segmentierung verwendet, um die Daten in Kategorien aufzuteilen.
Implementierungsplan
Wir haben es so entworfen, um die Struktur der Datentabelle nicht zu ändern. Wir unterscheiden anhand des Tabellennamens, welche Datentabelle das Projekt verwendet. Die daraus resultierenden Veränderungen sind relativ gering. Wir müssen den Code nur geringfügig ändern, um das Problem zu lösen. Das ist eine sehr frustrierende Sache.
Ändern Sie den Schlüsselwortcode und fügen Sie Datenquellen hinzu.
<?<span>php </span><span>define</span>('DATABASE_HOST','127.0.0.1'<span>); </span><span>define</span>('DATABASE_USER','xiaoshuaishuai'<span>); </span><span>define</span>('DATABASE__PASSWORD','xiaoshuaishuai'<span>); </span><span>define</span>('DATABASE_CHARSET','utf-8'<span>); </span><span>class</span><span> Keyword { </span><span>public</span> <span>$word</span><span>; </span><span>public</span> <span>static</span> <span>$conn</span> = <span>null</span><span>; </span><span>public</span> <span>function</span><span> getDbConn(){ </span><span>if</span>(self::<span>$conn</span> == <span>null</span><span>){ self</span>::<span>$conn</span> = <span>mysql_connect</span>(DATABASE_HOST,DATABASE_USER,<span>DATABASE__PASSWORD); </span><span>mysql_query</span>("SET NAMES '".DATABASE_CHARSET."'",self::<span>$conn</span><span>); </span><span>mysql_select_db</span>("dict",self::<span>$conn</span><span>); </span><span>return</span> self::<span>$conn</span><span>; } </span><span>return</span> self::<span>$conn</span><span>; } </span><span>public</span> <span>function</span><span> save(){ </span><span>$sql</span> = "insert into keywords(word) values ('<span>$this</span>->word')"<span>; </span><span>return</span> <span>mysql_query</span>(<span>$sql</span>,<span>$this</span>-><span>getDbConn()); } </span><span>public</span> <span>static</span> <span>function</span> getWordsSource(<span>$cid</span>,<span>$limit</span>=0,<span>$offset</span>=40<span>){ </span><span>$sql</span> = "SELECT * FROM keywords_<span>$cid</span> LIMIT <span>$limit</span>,<span>$ffset</span>"<span>; </span><span>return</span> DB::MakeArray(<span>$sql</span><span>); } </span><span>public</span> <span>static</span> <span>function</span> getWordsCount(<span>$cid</span><span>){ </span><span>$sql</span> = "SELECT count(*) FROM keywords_<span>$cid</span>"<span>; </span><span>return</span> DB::QueryScalar(<span>$sql</span><span>); } }</span>
Der DB-Klasse wird ein neuer QueryScalar hinzugefügt, der zur Berechnung des Gesamtbetrags verwendet wird
<?<span>php </span><span>#</span><span>@author oShine</span> <span>define</span>('DATABASE_HOST','127.0.0.1'<span>); </span><span>define</span>('DATABASE_USER','xiaoshuaishuai'<span>); </span><span>define</span>('DATABASE__PASSWORD','xiaoshuaishuai'<span>); </span><span>define</span>('DATABASE_CHARSET','utf-8'<span>); </span><span>class</span><span> DB { </span><span>public</span> <span>static</span> <span>$conn</span> = <span>null</span><span>; </span><span>public</span> <span>static</span> <span>function</span><span> Connect(){ </span><span>if</span>(self::<span>$conn</span> == <span>null</span><span>){ self</span>::<span>$conn</span> = <span>mysql_connect</span>(DATABASE_HOST,DATABASE_USER,<span>DATABASE__PASSWORD); </span><span>mysql_query</span>("SET NAMES '".DATABASE_CHARSET."'",self::<span>$conn</span><span>); </span><span>mysql_select_db</span>("dict",self::<span>$conn</span><span>); </span><span>return</span> self::<span>$conn</span><span>; } </span><span>return</span> self::<span>$conn</span><span>; } </span><span>public</span> <span>static</span> <span>function</span> Query(<span>$sql</span><span>){ </span><span>return</span> <span>mysql_query</span>(<span>$sql</span>,self::<span>Connect()); } </span><span>public</span> <span>static</span> <span>function</span> makeArray(<span>$sql</span><span>){ </span><span>$rs</span> = self::Query(<span>$sql</span><span>); </span><span>$result</span> = <span>array</span><span>(); </span><span>while</span>(<span>$data</span> = <span>mysql_fetch_assoc</span>(<span>$rs</span><span>)){ </span><span>$result</span>[] = <span>$data</span><span>; } </span><span>return</span> <span>$result</span><span>; } </span><span>public</span> <span>static</span> <span>function</span> QueryScalar(<span>$sql</span><span>){ </span><span>$rs</span> = self::Query(<span>$sql</span><span>); </span><span>$data</span> = <span>mysql_fetch_array</span>(<span>$rs</span><span>); </span><span>if</span>(<span>$data</span> == <span>false</span> || <span>empty</span>(<span>$data</span>) || !<span>isset</span>(<span>$data</span>[1])) <span>return</span> 0<span>; </span><span>return</span> <span>$data</span>[1<span>]; } } </span>
Ändern Sie den Auswahlcode für die Wortauswahl:
<?<span>php </span><span>#</span><span>@Filename:selector/Selector.php</span><span> #</span><span>@Author:oshine</span> <span>require_once</span> <span>dirname</span>(<span>__FILE__</span>) . '/SelectorItem.php'<span>; </span><span>require_once</span> <span>dirname</span>(<span>__FILE__</span>) . '/charlist/CharList.php'<span>; </span><span>require_once</span> <span>dirname</span>(<span>__FILE__</span>) . '/charlist/CharlistHandle.php'<span>; </span><span>require_once</span> <span>dirname</span>(<span>dirname</span>(<span>__FILE__</span>)) . '/lib/Logger.php'<span>; </span><span>class</span><span> Selector { </span><span>private</span> <span>static</span> <span>$charListHandle</span> = <span>array</span><span>( </span>"黑名单" => "BacklistCharListHandle", "近义词" => "LinklistCharListHandle"<span> ); </span><span>public</span> <span>static</span> <span>function</span> select(<span>$num_iid</span><span>) { </span><span>$selectorItem</span> = SelectorItem::createFromApi(<span>$num_iid</span><span>); Logger</span>::trace(<span>$selectorItem</span>-><span>props_name); </span><span>$charlist</span> = <span>new</span><span> CharList(); </span><span>foreach</span> (self::<span>$charListHandle</span> <span>as</span> <span>$matchKey</span> => <span>$className</span><span>) { </span><span>$handle</span> = self::createCharListHandle(<span>$className</span>, <span>$charlist</span>, <span>$selectorItem</span><span>); </span><span>$handle</span>-><span>exec</span><span>(); } </span><span>$selectWords</span> = <span>array</span><span>(); </span><span>$wordsCount</span> = Keyword::getWordsCount(selectorItem-><span>cid); </span><span>$offset</span> = 40<span>; </span><span>$page</span> = <span>ceil</span>(<span>$wordsCount</span>/<span>$offset</span><span>); </span><span>for</span>(<span>$i</span>=0;<span>$i</span><=<span>$page</span>;<span>$i</span>++<span>){ </span><span>$limit</span> = <span>$i</span>*<span>$offset</span><span>; </span><span>$keywords</span> = Keyword::getWordsSource(selectorItem->cid,<span>$limit</span>,<span>$offset</span><span>); </span><span>foreach</span> (<span>$keywords</span> <span>as</span> <span>$val</span><span>) { </span><span>#</span><span> code...</span> <span>$keywordEntity</span> = SplitterApp::<span>split</span>(<span>$val</span>["word"<span>]); </span><span>#</span><span> code...</span> <span>if</span>(MacthExector::macth(<span>$keywordEntity</span>,<span>$charlist</span><span>)){ </span><span>$selectWords</span>[] = <span>$val</span>["word"<span>]; } } } </span><span>return</span> <span>$selectWords</span><span>; } </span><span>public</span> <span>static</span> <span>function</span> createCharListHandle(<span>$className</span>, <span>$charlist</span>, <span>$selectorItem</span><span>) { </span><span>if</span> (<span>class_exists</span>(<span>$className</span><span>)) { </span><span>return</span> <span>new</span> <span>$className</span>(<span>$charlist</span>, <span>$selectorItem</span><span>); } </span><span>throw</span> <span>new</span> <span>Exception</span>("class not exists", 0<span>); } }</span>
Zusammenfassung
Xiao Shuai Shuai hat neue Wissenspunkte gelernt. Ist dies eine Möglichkeit, den Chef zu belohnen? Möchtest du mich auch belohnen? Gib mir bitte einen Daumen nach oben!
Das Obige stellt die eingehende Untersuchung des Keyword-Matching-Projekts (2) vor – die Einführung der Idee von Untertabellen, einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Lösung: Ihre Organisation verlangt von Ihnen, dass Sie Ihre PIN ändern

So passen Sie die Fensterrahmeneinstellungen unter Windows 11 an: Farbe und Größe ändern

So aktivieren oder deaktivieren Sie die Vorschau von Miniaturansichten in der Taskleiste unter Windows 11

Wie ändere ich die Farbe der Titelleiste unter Windows 11?

OOBELANGUAGE-Fehlerprobleme bei der Reparatur von Windows 11/10

Anleitung zur Anzeigeskalierung unter Windows 11

10 Möglichkeiten, die Helligkeit unter Windows 11 anzupassen

So beheben Sie den Discuz-Datenbankfehler
