Redis-Volltextsuche in PHP-Anwendungen

PHPz
Freigeben: 2023-05-19 08:08:01
Original
1515 Leute haben es durchsucht

Mit der kontinuierlichen Weiterentwicklung der Internettechnologie werden Suchmaschinen immer häufiger eingesetzt. Im Kontext des Internets sind Suchmaschinen zu einer der wichtigsten Möglichkeiten für Benutzer geworden, Informationen zu erhalten. Dabei spielt die Technologie der Volltextsuche eine entscheidende Rolle. Die Volltextsuche indiziert Textinhalte, um bei Benutzeranfragen schnell passenden Text zu finden. Es gibt viele Lösungen zur Implementierung der Volltextsuche in PHP-Anwendungen. Dieser Artikel konzentriert sich auf die Volltextsuche von Redis in PHP-Anwendungen.

Redis ist eine leistungsstarke, nicht relationale In-Memory-Datenbank, die eine Vielzahl von Datenstrukturen unterstützt, darunter Zeichenfolgen, Hashes, Listen, Mengen und geordnete Mengen. Redis bietet außerdem viele leistungsstarke Funktionen wie Publish/Subscribe, Transaktionen, Lua-Skripte usw. Daher eignet sich Redis für eine Vielzahl von Szenarien, z. B. Caching, Warteschlangen, Echtzeitzählung, verteilte Sperren usw. Gleichzeitig ist Redis aufgrund seiner hohen Leistung und Verfügbarkeit eine der am häufigsten verwendeten Datenspeichermethoden in PHP-Anwendungen.

Das Grundprinzip von Redis zur Implementierung der Volltextsuche besteht darin, Textinhalte während der Abfrage schnell zu finden, indem ein Index erstellt wird. Bei der Indizierung muss der Textinhalt in mehrere Wörter zerlegt und anschließend eine Zuordnungsbeziehung zwischen diesen Wörtern und den Bezeichnern des Textinhalts hergestellt werden. In der Datenstruktur, die den Index speichert, entspricht jedes Wort einer geordneten Menge, und diese geordnete Menge speichert die Kennung und die Häufigkeit des Vorkommens des Textinhalts, in dem das Wort vorkommt. Zerlegen Sie bei der Abfrage zunächst die Abfragezeichenfolge in mehrere Wörter, ermitteln Sie dann die Kennung des Textinhalts aus der geordneten Menge, die dem Wort entspricht, sortieren Sie sie nach der Anzahl des Vorkommens und geben Sie schließlich die Ergebnisse zurück.

In PHP-Anwendungen bietet Redis viele Möglichkeiten, die Volltextsuche zu implementieren. Die am häufigsten verwendeten sind die von Redis bereitgestellten Sorted Set- und Lua-Skripte. Die spezifischen Implementierungsdetails lauten wie folgt:

  1. Erstellen eines Indexes

Der Prozess der Erstellung eines Indexes wird im Allgemeinen beim Start des Servers durchgeführt. Der zu indizierende Textinhalt wird aus der Datenbank gelesen und dann in mehrere Teile zerlegt Wörter, und diese Wörter und Texte sind Die Kennung des Inhalts stellt eine Zuordnungsbeziehung her und schließlich wird das Ergebnis in Redis gespeichert. Der spezifische Code lautet wie folgt:

<?php
// 建立索引
function buildIndex($redis, $db)
{
    $sql = "SELECT id, title, content FROM article";
    $sth = $db->query($sql);

    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
        $id = $row['id'];
        $title = $row['title'];
        $content = $row['content'];

        // 分解单词
        $words = preg_split('/s+/', $title . ' ' . $content);
        $words = array_unique($words);

        foreach ($words as $word) {
            if (!$word) {
                continue;
            }

            $redis->zIncrBy('index:' . $word, 1, $id);
        }
    }
}
?>
Nach dem Login kopieren
  1. Abfrage

Der Abfragevorgang ist in zwei Schritte unterteilt. Zuerst wird die Abfragezeichenfolge in mehrere Wörter zerlegt und dann die Kennung des Textinhalts aus der entsprechenden geordneten Sammlung abgerufen nach dem Wort sortieren und nach der Anzahl der Vorkommen sortieren und schließlich die Ergebnisse zurückgeben. Der spezifische Code lautet wie folgt:

<?php
// 全文搜索
function search($redis, $query, $offset, $count)
{
    $words = preg_split('/s+/', $query);
    $words = array_unique($words);

    $tmpKeys = array();
    foreach ($words as $word) {
        if (!$word) {
            continue;
        }

        $tmpKey = 'idx:' . $word;
        $redis->zInter($tmpKey, array('index:' . $word), array(1));
        $tmpKeys[] = $tmpKey;
    }

    $redis->zUnion('idx:result', $tmpKeys, array(1));
    $redis->zRevRange('idx:result', $offset, $offset + $count - 1);
}
?>
Nach dem Login kopieren
  1. Lua-Skript

Um die Netzwerkübertragung zu reduzieren und die Abfrageeffizienz zu verbessern, können Sie das Lua-Skript verwenden, um den Abfrageprozess in einen Befehl zu kapseln. Der spezifische Code lautet wie folgt:

<?php
// 全文搜索,使用 Lua 脚本实现
function search($redis, $query, $offset, $count)
{
    $script = "
        local words = redis.call('SPLIT', ARGV[1], '[^%w]+')
        local tmpKeys = {}
        for i, word in ipairs(words) do
            if word ~= '' then
                local tmpKey = 'idx:' .. word
                redis.call('ZINTERSTORE', tmpKey, 1, 'index:' .. word)
                table.insert(tmpKeys, tmpKey)
            end
        end
        redis.call('ZUNIONSTORE', 'idx:result', #tmpKeys, unpack(tmpKeys))
        return redis.call('ZREVRANGE', 'idx:result', ARGV[2], ARGV[3])
    ";

    return $redis->eval($script, 3, $query, $offset, $offset + $count - 1);
}
?>
Nach dem Login kopieren

Zusammenfassung:

Redis implementiert die Volltextsuche in PHP-Anwendungen. Durch die Einrichtung von Indizes können Textinhalte bei Abfragen schnell gefunden werden, wodurch die Vorteile der hohen Leistung und Verfügbarkeit von Redis voll ausgeschöpft werden . Durch die Verwendung der von Redis bereitgestellten Sorted Set- und Lua-Skripte kann die Volltextsuchaufgabe besser erledigt werden, was eine effiziente Lösung für PHP-Entwickler darstellt. Es ist jedoch zu beachten, dass Redis bei großen Datenmengen möglicherweise mit dem Problem eines unzureichenden Speichers konfrontiert ist. Zu diesem Zeitpunkt muss eine angemessene Datenspeicher- und Indizierungsstrategie entwickelt werden, um einen Redis-Speicherüberlauf zu vermeiden.

Das obige ist der detaillierte Inhalt vonRedis-Volltextsuche in PHP-Anwendungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!