Maison > Article > développement back-end > Recherche en texte intégral Redis dans les applications PHP
Avec le développement continu de la technologie Internet, les moteurs de recherche sont de plus en plus utilisés. Dans le contexte d’Internet, les moteurs de recherche sont devenus l’un des principaux moyens permettant aux utilisateurs d’obtenir des informations. Dans ce processus, la technologie de recherche en texte intégral joue un rôle crucial. La recherche en texte intégral indexe le contenu du texte pour localiser rapidement le texte correspondant lorsque les utilisateurs interrogent. Il existe de nombreuses solutions pour implémenter la recherche en texte intégral dans les applications PHP, et cet article se concentrera sur la recherche en texte intégral de Redis dans les applications PHP.
Redis est une base de données en mémoire non relationnelle hautes performances qui prend en charge une variété de structures de données, notamment des chaînes, des hachages, des listes, des ensembles et des ensembles ordonnés. Redis fournit également de nombreuses fonctions puissantes, telles que la publication/abonnement, les transactions, les scripts Lua, etc. Par conséquent, Redis convient à une variété de scénarios, tels que la mise en cache, les files d'attente, le comptage en temps réel, les verrous distribués, etc. Dans le même temps, les hautes performances et la haute disponibilité de Redis en font également l'une des méthodes de stockage de données les plus couramment utilisées dans les applications PHP.
Le principe de base de Redis pour implémenter la recherche en texte intégral est de localiser rapidement le contenu du texte lors d'une requête en établissant un index. Dans le processus d'indexation, le contenu du texte doit être décomposé en plusieurs mots, puis une relation de mappage est établie entre ces mots et les identifiants du contenu du texte. Dans la structure de données qui stocke l'index, chaque mot correspond à un ensemble ordonné, et cet ensemble ordonné stocke l'identifiant et le nombre d'occurrences du contenu textuel dans lequel le mot apparaît. Lors de l'interrogation, décomposez d'abord la chaîne de requête en plusieurs mots, puis obtenez l'identifiant du contenu du texte à partir de l'ensemble ordonné correspondant au mot, triez-les en fonction du nombre d'occurrences, et enfin renvoyez les résultats.
Dans les applications PHP, Redis dispose de nombreuses façons d'implémenter la recherche en texte intégral. Les plus couramment utilisées sont les scripts Sorted Set et Lua fournis par Redis. Les détails spécifiques de l'implémentation sont les suivants :
Le processus d'indexation est généralement effectué au démarrage du serveur, et le contenu du texte qui doit être indexé est modifié en le lisant depuis la base de données, puis le décompose en plusieurs mots, établit une relation de mappage entre ces mots et les identifiants du contenu du texte, et enfin stocke les résultats dans Redis. Le code spécifique est le suivant :
<?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); } } } ?>
Le processus de requête est divisé en deux étapes. Premièrement, la chaîne de requête est décomposée en. plusieurs mots. Obtenez ensuite l'identifiant du contenu du texte à partir de l'ensemble ordonné correspondant au mot, triez-les selon le nombre d'occurrences, et enfin renvoyez le résultat. Le code spécifique est le suivant :
<?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); } ?>
Afin de réduire la transmission réseau et d'améliorer l'efficacité des requêtes, vous pouvez utiliser le script Lua pour encapsuler le processus de requête dans une commande. Le code spécifique est le suivant :
<?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); } ?>
Résumé :
Redis implémente la recherche en texte intégral dans les applications PHP En établissant des index, le contenu du texte peut être rapidement localisé lors des requêtes, ce qui donne. Profitez pleinement des hautes performances de Redis et des avantages de la haute disponibilité. En utilisant les scripts Sorted Set et Lua fournis par Redis, la tâche de recherche en texte intégral peut être mieux effectuée, offrant ainsi une solution efficace aux développeurs PHP. Cependant, il convient de noter que lorsque la quantité de données est importante, Redis peut être confronté au problème d'une mémoire insuffisante. À l’heure actuelle, une stratégie raisonnable de stockage et d’indexation des données doit être conçue pour éviter un débordement de mémoire Redis.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!