インターネット技術の継続的な発展に伴い、検索エンジンはますます広く使用されるようになりました。インターネットの文脈では、検索エンジンはユーザーが情報を入手する主な方法の 1 つになっています。このプロセスでは、全文検索技術が重要な役割を果たします。全文検索では、テキスト コンテンツにインデックスを付けて、ユーザーがクエリを実行したときに一致するテキストをすばやく見つけます。 PHP アプリケーションで全文検索を実装するためのソリューションは数多くありますが、この記事では PHP アプリケーションでの Redis の全文検索に焦点を当てます。
Redis は、文字列、ハッシュ、リスト、セット、順序付きセットなど、さまざまなデータ構造をサポートする高性能の非リレーショナル インメモリ データベースです。 Redis は、パブリッシュ/サブスクライブ、トランザクション、Lua スクリプトなど、多くの強力な機能も提供します。したがって、Redis は、キャッシュ、キュー、リアルタイムのカウント、分散ロックなどのさまざまなシナリオに適しています。同時に、Redis は高いパフォーマンスと高可用性を備えているため、PHP アプリケーションで最も一般的に使用されるデータ ストレージ方法の 1 つとなっています。
全文検索を実装する Redis の基本原則は、インデックスを確立することでクエリ中にテキスト コンテンツを迅速に見つけることです。インデックス付けのプロセスでは、テキスト コンテンツをいくつかの単語に分解し、これらの単語とテキスト コンテンツの識別子との間にマッピング関係を確立する必要があります。インデックスを格納するデータ構造では、各単語は順序付きセットに対応し、この順序付きセットには、単語が出現するテキスト コンテンツの識別子と出現回数が格納されます。クエリを実行する場合、まずクエリ文字列をいくつかの単語に分解し、次にその単語に対応する順序付きセットからテキスト コンテンツの識別子を取得し、出現回数に従って並べ替えて、最後に結果を返します。
PHP アプリケーションでは、Redis には全文検索を実装するためのさまざまな方法があります。最も一般的に使用される方法は、Redis が提供する Sorted Set および Lua スクリプトを使用する方法です。具体的な実装の詳細は次のとおりです。
インデックスを確立するプロセスは通常、サーバーの起動時に実行され、必要なテキスト コンテンツが作成されます。インデックス付けされる文字列がデータベースから読み取られ、それをいくつかの単語に分解し、これらの単語とテキスト コンテンツの識別子との間のマッピング関係を確立し、最後に結果を Redis に保存します。具体的なコードは次のとおりです:
<?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); } } } ?>
クエリ プロセスは 2 つのステップに分かれており、最初にクエリ文字列が複数の単語に分解され、次にクエリ文字列が複数の単語に分解されます。対応する単語は、順序付けられたコレクションからテキスト コンテンツの識別子を取得し、出現回数に従って並べ替えて、最終的に結果を返します。具体的なコードは次のとおりです。
<?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); } ?>
ネットワーク送信を削減し、クエリの効率を向上させるために、Lua スクリプトを使用してクエリ プロセスをカプセル化できます。コマンド。具体的なコードは次のとおりです:
<?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); } ?>
概要:
Redis は PHP アプリケーションに全文検索を実装します。インデックスを確立することで、クエリ中にテキスト コンテンツをすばやく見つけることができ、 Redis の高パフォーマンスと高可用性の利点。 Redis が提供する Sorted Set および Lua スクリプトを使用すると、全文検索タスクをより適切に完了でき、PHP 開発者に効率的なソリューションが提供されます。ただし、データ量が多い場合、Redis はメモリ不足の問題に直面する可能性があることに注意してください。現時点では、Redis メモリのオーバーフローを回避するために、合理的なデータ ストレージとインデックス作成戦略を設計する必要があります。
以上がPHP アプリケーションでの Redis 全文検索の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。