Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Carian teks penuh Redis dalam aplikasi PHP

Carian teks penuh Redis dalam aplikasi PHP

PHPz
PHPzasal
2023-05-19 08:01:351471semak imbas

Dengan perkembangan teknologi Internet yang berterusan, enjin carian semakin digunakan secara meluas. Dalam konteks Internet, enjin carian telah menjadi salah satu cara utama untuk pengguna mendapatkan maklumat. Dalam proses ini, teknologi carian teks penuh memainkan peranan yang penting. Carian teks penuh mengindeks kandungan teks untuk mencari teks yang sepadan dengan cepat apabila pengguna bertanya. Terdapat banyak penyelesaian untuk melaksanakan carian teks penuh dalam aplikasi PHP, dan artikel ini akan menumpukan pada carian teks penuh Redis dalam aplikasi PHP.

Redis ialah pangkalan data dalam memori bukan perhubungan berprestasi tinggi yang menyokong pelbagai struktur data, termasuk rentetan, cincang, senarai, set dan set tersusun. Redis juga menyediakan banyak ciri berkuasa, seperti terbitkan/langganan, transaksi, skrip Lua, dsb. Oleh itu, Redis sesuai untuk pelbagai senario, seperti caching, baris gilir, pengiraan masa nyata, kunci teragih, dsb. Pada masa yang sama, prestasi tinggi dan ketersediaan tinggi Redis juga menjadikannya salah satu kaedah penyimpanan data yang paling biasa digunakan dalam aplikasi PHP.

Prinsip asas Redis untuk melaksanakan carian teks penuh adalah untuk mencari kandungan teks dengan cepat semasa pertanyaan dengan mewujudkan indeks. Dalam proses pengindeksan, kandungan teks perlu diuraikan kepada beberapa perkataan, dan kemudian hubungan pemetaan diwujudkan antara perkataan ini dan pengecam kandungan teks. Dalam struktur data yang menyimpan indeks, setiap perkataan sepadan dengan set tersusun, dan set tertib ini menyimpan pengecam dan bilangan kejadian kandungan teks di mana perkataan itu muncul. Apabila membuat pertanyaan, mula-mula uraikan rentetan pertanyaan kepada beberapa perkataan, kemudian dapatkan pengecam kandungan teks daripada set tersusun yang sepadan dengan perkataan itu, isikannya mengikut bilangan kejadian, dan akhirnya kembalikan hasilnya.

Dalam aplikasi PHP, Redis mempunyai banyak cara untuk melaksanakan carian teks penuh Yang paling biasa digunakan ialah melalui skrip Set Isih dan Lua yang disediakan oleh Redis. Butiran pelaksanaan khusus adalah seperti berikut:

  1. Mencipta indeks

Proses penubuhan indeks biasanya dijalankan apabila pelayan bermula, dan kandungan teks yang perlu diindeks dibaca daripada pangkalan data Kemudian menguraikannya kepada beberapa perkataan, mewujudkan hubungan pemetaan antara perkataan ini dan pengecam kandungan teks, dan akhirnya menyimpan hasilnya dalam Redis. Kod khusus adalah seperti berikut:

<?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);
        }
    }
}
?>
  1. Query

Proses pertanyaan dibahagikan kepada dua langkah Pertama, rentetan pertanyaan diuraikan kepada beberapa perkataan, dan kemudian setiap satu perkataan sepadan dengan Dapatkan pengecam kandungan teks daripada koleksi tersusun, susun mengikut bilangan kejadian, dan akhirnya kembalikan hasilnya. Kod khusus adalah seperti berikut:

<?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);
}
?>
  1. Skrip Lua

Untuk mengurangkan penghantaran rangkaian dan meningkatkan kecekapan pertanyaan, anda boleh menggunakan skrip Lua untuk merangkum proses pertanyaan ke dalam suatu perintah. Kod khusus adalah seperti berikut:

<?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);
}
?>

Ringkasan:

Redis melaksanakan carian teks penuh dalam aplikasi PHP Dengan mewujudkan indeks, kandungan teks boleh dicari dengan cepat semasa pertanyaan, memberikan permainan penuh kepada prestasi tinggi dan ketersediaan tinggi kelebihan Redis. Dengan menggunakan skrip Sorted Set dan Lua yang disediakan oleh Redis, tugas carian teks penuh boleh diselesaikan dengan lebih baik, menyediakan penyelesaian yang cekap untuk pembangun PHP. Walau bagaimanapun, perlu diingatkan bahawa apabila jumlah data adalah besar, Redis mungkin menghadapi masalah memori yang tidak mencukupi. Pada masa ini, strategi penyimpanan dan pengindeksan data yang munasabah perlu direka bentuk untuk mengelakkan limpahan memori Redis.

Atas ialah kandungan terperinci Carian teks penuh Redis dalam aplikasi PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn