Eingehende Untersuchung von Keyword-Matching-Projekten (2) – Einführung der Idee von Untertabellen

WBOY
Freigeben: 2016-08-08 09:31:53
Original
923 Leute haben es durchsucht

(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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Ä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>
Nach dem Login kopieren

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.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage