当前位置:首页 > 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数组和字符串函数实现简单检索:

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实现全文检索

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

相关文章

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="uploa…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session…

php验证码的实现

php验证码的实现

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