当前位置:首页 > PHP

php实现全文检索

2026-02-16 00:38:49PHP

PHP实现全文检索的方法

使用MySQL的全文检索功能

MySQL提供了全文检索功能,适用于InnoDB和MyISAM引擎。需要在表中创建FULLTEXT索引,然后使用MATCH AGAINST语法进行查询。

-- 创建表时添加全文索引
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    FULLTEXT(title, content)
);

-- 使用全文检索查询
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('搜索关键词');

PHP代码示例:

$keyword = 'PHP教程';
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM articles WHERE MATCH(title, content) AGAINST(:keyword)");
$stmt->bindValue(':keyword', $keyword);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

使用Elasticsearch

Elasticsearch是专业的全文搜索引擎,性能强大但需要额外安装和配置。

安装Elasticsearch客户端:

composer require elasticsearch/elasticsearch

PHP代码示例:

require 'vendor/autoload.php';
$client = Elastic\Elasticsearch\ClientBuilder::create()->build();

$params = [
    'index' => 'articles',
    'body'  => [
        'query' => [
            'match' => [
                'content' => 'PHP教程'
            ]
        ]
    ]
];

$response = $client->search($params);
$results = $response['hits']['hits'];

使用Sphinx搜索引擎

Sphinx是开源的全文搜索引擎,支持高速索引和搜索。

配置示例(sphinx.conf):

source articles {
    type = mysql
    sql_host = localhost
    sql_user = username
    sql_pass = password
    sql_db = test
    sql_query = SELECT id, title, content FROM articles
}

index articles {
    source = articles
    path = /var/data/articles
    docinfo = extern
    mlock = 0
    morphology = stem_en
}

searchd {
    listen = 9312
    log = /var/log/sphinx/searchd.log
    query_log = /var/log/sphinx/query.log
}

PHP代码示例:

$sphinx = new SphinxClient();
$sphinx->SetServer('localhost', 9312);
$result = $sphinx->Query('PHP教程', 'articles');
$matches = $result['matches'];

使用SQLite的FTS扩展

SQLite提供FTS(全文搜索)扩展模块,适合轻量级应用。

$db = new SQLite3(':memory:');
$db->exec('CREATE VIRTUAL TABLE docs USING fts5(title, content)');
$db->exec("INSERT INTO docs VALUES('PHP教程', '学习PHP编程语言')");

$results = $db->query("SELECT * FROM docs WHERE docs MATCH 'PHP'");
while ($row = $results->fetchArray()) {
    print_r($row);
}

使用纯PHP实现简单全文检索

对于小型应用,可以用PHP数组和字符串函数实现简单检索:

php实现全文检索

function simpleSearch($docs, $query) {
    $results = [];
    $queryTerms = explode(' ', strtolower($query));

    foreach ($docs as $id => $doc) {
        $text = strtolower($doc['title'] . ' ' . $doc['content']);
        $matchCount = 0;

        foreach ($queryTerms as $term) {
            if (strpos($text, $term) !== false) {
                $matchCount++;
            }
        }

        if ($matchCount > 0) {
            $results[$id] = [
                'doc' => $doc,
                'score' => $matchCount / count($queryTerms)
            ];
        }
    }

    uasort($results, function($a, $b) {
        return $b['score'] <=> $a['score'];
    });

    return array_column($results, 'doc');
}

选择方案时应考虑数据量、性能需求和技术复杂度。MySQL全文检索适合中小型应用,Elasticsearch适合大型复杂搜索需求,Sphinx提供平衡的性能和功能,SQLite适合嵌入式应用,纯PHP实现仅适用于极小规模数据。

标签: 全文php
分享给朋友:

相关文章

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php搜索功能实现的

php搜索功能实现的

PHP 搜索功能实现方法 数据库搜索实现 使用 SQL 的 LIKE 语句进行模糊匹配,适用于小型网站和简单搜索需求。 $searchTerm = $_GET['search']; $query =…

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…