andydefer/php-search 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

andydefer/php-search

Composer 安装命令:

composer require andydefer/php-search

包简介

Fuzzy search package for PHP CLI

README 文档

README

📦 Présentation

PHP Search est une bibliothèque PHP moderne pour la recherche floue dans des fichiers JSONL. Elle offre une solution complète avec indexation persistante, cache des résultats et support multi-index.

Caractéristiques principales

  • Recherche floue basée sur l'analyse de n-grams (2, 3 et 4)
  • Indexation persistante pour des recherches ultra-rapides
  • Cache automatique des résultats (TTL 24h)
  • Multi-index : gérez plusieurs sources indépendantes
  • Streaming : lisez ligne par ligne sans surcharge mémoire
  • Support multi-format : fichiers, dossiers, streams, itérables
  • CLI complet pour l'indexation et la recherche
  • Architecture modulaire avec injection de dépendances
  • Support PHP 8.2+ avec types stricts

🚀 Installation

composer require andydefer/php-search

🎯 Utilisation rapide

En ligne de commande

# Indexer un dossier de fichiers JSONL
./vendor/bin/php-search index ./data

# Rechercher (utilise le dernier index)
./vendor/bin/php-search "Leonard" 10

# Rechercher dans un index spécifique
./vendor/bin/php-search "Cardio" 5 --source=./doctors

En PHP

<?php

declare(strict_types=1);

use AndyDefer\PhpSearch\Engines\SearchEngine;
use AndyDefer\PhpSearch\Configs\EngineConfig;
use AndyDefer\PhpServices\Services\FileSystemService;

// Initialisation
$fileSystem = new FileSystemService();
$config = new EngineConfig(getcwd());
$queryProcessor = $container->get(QueryProcessorInterface::class);
$preFilter = $container->get(PreFilterInterface::class);

$engine = new SearchEngine($queryProcessor, $fileSystem, $config, $preFilter);

// Indexation
$engine->index('./data');

// Recherche
$results = $engine->search('Leonard', 10);

foreach ($results as $result) {
    echo $result['name'] . ' - ' . $result['percentage'] . "%\n";
}

📚 Architecture

Moteurs de recherche

Moteur Description Usage
SearchEngine Moteur principal avec indexation persistante Production, gros volumes
JsonlSearchEngine Recherche directe sans index Petits volumes, tests

Composants principaux

SearchEngine (principal)
    ├── QueryProcessorInterface → Traitement des requêtes
    ├── PreFilterInterface → Filtrage rapide
    ├── FileSystemInterface → Opérations fichiers
    └── EngineConfig → Configuration

JsonlSearchEngine (direct)
    ├── JsonlService → Lecture JSONL
    ├── QueryProcessorInterface → Traitement des requêtes
    └── PreFilterInterface → Filtrage rapide

📝 API principale

SearchEngine

Méthode Description
index(string $source): int Indexe une source (dossier/fichier)
search(string $query, int $limit = 5, ?string $source = null): array Recherche dans l'index
hasIndex(?string $source = null): bool Vérifie l'existence d'un index
getIndexStats(?string $source = null): array Statistiques de l'index
deleteIndex(?string $source = null): void Supprime un index
clearCache(?string $source = null, ?string $query = null): void Vide le cache
listIndexes(): array Liste tous les index

JsonlSearchEngine

Méthode Description
searchInDirectory(string $directory, array $fields, string $query, int $limit = 5): array Recherche dans un dossier
searchInFile(string $filePath, array $fields, string $query, int $limit = 5): array Recherche dans un fichier
searchInStream($stream, array $fields, string $query, int $limit = 5): array Recherche dans un stream
searchInIterable(iterable $iterable, array $fields, string $query, int $limit = 5): array Recherche dans un itérable
searchInIndex(string $indexPath, string $query, int $limit = 5): array Recherche dans un index

💡 Cas d'utilisation

1. Indexation de logs JSONL

$engine->index('./logs');

// Recherche d'erreurs
$errors = $engine->search('error', 50);

foreach ($errors as $error) {
    echo $error['name'] . "\n";
    echo "Source: {$error['source']}\n";
}

2. Cache de résultats de recherche

// Première recherche (cache miss)
$results = $engine->search('Leonard', 10);

// Deuxième recherche (cache hit - instantané)
$results = $engine->search('Leonard', 10);

3. Multi-index pour différents domaines

$engine->index('./doctors');
$engine->index('./patients');

$doctors = $engine->search('Cardio', 5, './doctors');
$patients = $engine->search('Marie', 5, './patients');

4. Recherche directe sans index

use AndyDefer\PhpSearch\Engines\JsonlSearchEngine;

$directEngine = new JsonlSearchEngine($jsonlService, $fileSystem, $queryProcessor, $preFilter);

// Recherche directe dans un fichier
$results = $directEngine->searchInFile('./data.jsonl', ['name'], 'Leonard', 10);

🔧 CLI - Commandes complètes

# Indexation
./vendor/bin/php-search index ./docs
./vendor/bin/php-search index ./docs/artists.jsonl

# Recherche (dernier index)
./vendor/bin/php-search "Leonard" 10

# Recherche dans un index spécifique
./vendor/bin/php-search "Doctor" 5 --source=./docs2

# Gestion des index
./vendor/bin/php-search --list-indexes
./vendor/bin/php-search --stats --source=./docs
./vendor/bin/php-search --delete-index --source=./docs
./vendor/bin/php-search --clear-cache --source=./docs
./vendor/bin/php-search --clear-cache --source=./docs --query=Leonard

📊 Performance

Opération Complexité Notes
Indexation O(n × m) n = lignes, m = champs
Recherche (cache hit) O(1) Lecture fichier cache
Recherche (cache miss) O(i) i = items dans l'index
Recherche directe O(f × l) f = fichiers, l = lignes

🔗 Dépendances

  • PHP ^8.2 - Langage requis
  • andydefer/php-jsonl - Gestion des fichiers JSONL
  • andydefer/php-services - Services de base
  • andydefer/php-vo - Value objects
  • andydefer/domain-structures - Structures de domaine

📜 License

MIT License

👨‍💻 Auteur

Andy Kani - andykanidimbu@gmail.com

🙏 Contributions

Les contributions sont les bienvenues !

📖 Résumé rapide

# CLI
./vendor/bin/php-search index ./data
./vendor/bin/php-search "Leonard" 10
./vendor/bin/php-search --stats
./vendor/bin/php-search --list-indexes
// PHP
$engine->index('./data');
$results = $engine->search('Leonard', 10);

foreach ($results as $result) {
    echo $result['name'] . "\n";
}

统计信息

  • 总下载量: 0
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 3
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-06-16