当前位置:首页 > 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客户端:

php实现全文检索

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):

php实现全文检索

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中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php实现跳转

php实现跳转

PHP 实现页面跳转的方法 在 PHP 中实现页面跳转有多种方式,以下是常见的几种方法及其适用场景: 使用 header() 函数 通过 header() 函数发送 HTTP 头部信息实现跳转。注意…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…

php 购物车实现session

php 购物车实现session

PHP 购物车实现(基于 Session) 在 PHP 中,使用 Session 实现购物车功能是一种常见方法。Session 可以跨页面存储用户数据,适合临时保存购物车信息。 初始化 Sessio…

php 实现排名

php 实现排名

PHP 实现排名的方法 在 PHP 中实现排名功能通常涉及对数据进行排序、计算排名以及输出结果。以下是几种常见的实现方式: 基本数组排序排名 $scores = [85, 92, 78, 95, 8…

php实现单例模式

php实现单例模式

单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于数据库连接、日志记录器等需要全局唯一实例的场景。 PHP实现单例模式的关键步骤 私有化构造函…