はじめに
udm_add_search_limit() は、かつてPHPに組み込まれていた mnoGoSearch(旧称 UdmSearch)という全文検索エンジンとの連携用拡張モジュールに属する関数で、検索結果に対して言語・カテゴリ・タグ・更新日時などの絞り込み条件(検索制限)を追加するために使われていました。
まず最初に押さえておくべき重要な点として、この関数はPHP 5.1.0で標準拡張としてはPHP本体から削除されており、現行のPHPバージョン(PHP 7系・8系)では標準では利用できません。かつてWebサイトのサイト内検索機能を実装する際に使われていた歴史的な関数であり、新規のプロジェクトでこの関数を使うことは推奨されません。本記事では、この関数がどのようなものだったのか、なぜ使えなくなったのか、そして現在サイト内検索を実装する場合にどのような選択肢があるのかを解説します。
関数概要
| 項目 | 内容 |
|---|---|
| 関数名 | udm_add_search_limit() |
| 所属拡張 | mnoGoSearch拡張(旧称 UdmSearch) |
| シグネチャ(当時) | udm_add_search_limit(resource $agent, int $var, string $val): bool |
| 引数1 | $agent — udm_alloc_agent() で生成したエージェントリソース |
| 引数2 | $var — 制限の種類を表す定数(UDM_LIMIT_CAT、UDM_LIMIT_LANG、UDM_LIMIT_TAG、UDM_LIMIT_DATE など) |
| 引数3 | $val — 制限の値 |
| 戻り値 | 成功時に true、失敗時に false |
| 対応バージョン | PHP 4.0.5〜PHP 5.0.5(PECL拡張としては別途配布) |
| 現在の状態 | PHP 5.1.0でPHP本体のバンドル拡張から削除。現行PHPでは利用不可 |
| 現代の代替 | Elasticsearch、Meilisearch、Sphinx、データベースの全文検索機能など |
全体像(イメージ図)
かつての mnoGoSearch 連携の流れ
┌─────────────────────────┐
│ udm_alloc_agent() │ ← DB接続してエージェントを生成
│ │ │
│ ▼ │
│ udm_add_search_limit() │ ← ここで検索条件を絞り込む
│ (言語・カテゴリ・日付などを指定) │
│ │ │
│ ▼ │
│ udm_find() │ ← 実際の検索を実行
│ │ │
│ ▼ │
│ udm_free_agent() │ ← エージェントを解放
└─────────────────────────┘
│
▼
PHP 5.1.0でこの一連の udm_* 関数群が
PHP本体からまとめて削除された
ポイントは、udm_add_search_limit() は単体で使う関数ではなく、udm_alloc_agent() でエージェント(検索セッション)を生成し、udm_find() で検索を実行するという一連のワークフローの中の一部だったという点です。そして、この一連の udm_* 関数群は、mnoGoSearchというC言語で書かれた外部の検索エンジンソフトウェアと連携するための拡張であり、PHP単体の標準機能ではありませんでした。
なぜ廃止されたのか
udm_add_search_limit() を含む udm_* 関数群がPHP本体から削除された背景には、主に以下のような事情があります。
- 外部ソフトウェアへの強い依存 mnoGoSearchという専用の検索エンジンソフトウェアを別途インストール・運用する必要があり、多くのユーザーにとって導入のハードルが高い機能でした。
- メンテナンスの負担 PHP本体にバンドルされる拡張は継続的なメンテナンスが必要ですが、利用者数が限定的な拡張は次第に開発リソースが割かれなくなっていきました。
- 代替技術の台頭 その後、Sphinx、Elasticsearch、Apache Solrなど、より高機能で広く使われる全文検索エンジンが登場し、PHPからはHTTP API経由でこれらと連携するのが一般的な手法になっていきました。
(参考・歴史的資料)当時の使用イメージ
以下は、この関数が実際に使われていた当時(PHP 5.0系以前)のコード例です。現行のPHPでは実行できない点にご注意ください。あくまで、当時どのような使われ方をしていたかを理解するための参考資料としてご覧ください。
<?php
// 注意: 以下はPHP 5.0系以前でのみ動作する歴史的なコード例です
// 現行のPHP 7/8では udm_alloc_agent() 等の関数自体が存在しません
// 1. mnoGoSearchデータベースへのエージェントを生成
$agent = udm_alloc_agent('mysql://user:pass@localhost/mnogosearch/');
// 2. 日本語のドキュメントのみに検索を制限する
udm_add_search_limit($agent, UDM_LIMIT_LANG, 'ja');
// 3. 特定のカテゴリに絞り込む
udm_add_search_limit($agent, UDM_LIMIT_CAT, '0102'); // 例: "ニュース > 技術" カテゴリ
// 4. 検索を実行する
$result = udm_find($agent, 'PHP チュートリアル');
if ($result) {
$total = udm_get_res_param($result, UDM_PARAM_FOUND);
echo "検索結果: {$total}件" . PHP_EOL;
}
// 5. エージェントを解放する
udm_free_agent($agent);
このコード例が示すように、udm_add_search_limit() は「検索条件を段階的に積み上げていく」ためのビルダー的な役割を担っていました。この設計思想自体は、現代の検索エンジンクライアントライブラリ(後述)にも通じるものがあります。
現代における代替手段
サイト内検索や絞り込み検索を実装したい場合、現在では以下のような選択肢が一般的です。
選択肢1:Elasticsearch / OpenSearchとPHPクライアントを使う
<?php
class ElasticSearchLimiter
{
public function __construct(private \Elastic\Elasticsearch\Client $client)
{
}
/**
* udm_add_search_limit()の"言語制限"に相当する処理を
* Elasticsearchのフィルタクエリで実現する例
*/
public function searchWithLimits(string $keyword, string $language, string $category): array
{
$response = $this->client->search([
'index' => 'articles',
'body' => [
'query' => [
'bool' => [
'must' => ['match' => ['content' => $keyword]],
'filter' => [
['term' => ['language' => $language]],
['term' => ['category' => $category]],
],
],
],
],
]);
return $response['hits']['hits'];
}
}
選択肢2:データベースの全文検索機能を使う
<?php
class MysqlFullTextSearcher
{
public function __construct(private PDO $pdo)
{
}
/**
* MySQLのFULLTEXTインデックスと条件句を組み合わせて
* udm_add_search_limit()相当の絞り込みを実現する
*/
public function search(string $keyword, string $language): array
{
$stmt = $this->pdo->prepare(
'SELECT * FROM articles
WHERE MATCH(content) AGAINST(:keyword IN NATURAL LANGUAGE MODE)
AND language = :language'
);
$stmt->execute(['keyword' => $keyword, 'language' => $language]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
選択肢3:Meilisearchの軽量な絞り込み検索を使う
<?php
class MeilisearchLimiter
{
public function __construct(private \Meilisearch\Client $client)
{
}
/**
* Meilisearchのfilter機能で、udm_add_search_limit()が担っていた
* 「カテゴリ・言語による絞り込み」を実現する
*/
public function search(string $keyword, string $category): array
{
$index = $this->client->index('articles');
return $index->search($keyword, [
'filter' => "category = '{$category}'",
])->getHits();
}
}
関連関数との比較(当時のmnoGoSearch関数群)
| 関数 | 役割 | 現在の状態 |
|---|---|---|
udm_add_search_limit() | 検索制限を追加する | 本記事の対象。PHP 5.1.0で削除済み |
udm_alloc_agent() | 検索エージェント(セッション)を生成 | 同上、削除済み |
udm_find() | 実際の検索を実行 | 同上、削除済み |
udm_clear_search_limits() | 設定した検索制限をリセット | 同上、削除済み |
udm_free_agent() | エージェントリソースを解放 | 同上、削除済み |
よくある落とし穴(注意点)
- 現行のPHPでは関数自体が存在しない
Call to undefined function udm_add_search_limit()というFatal Errorが発生します。古いソースコードやチュートリアル記事を参考にする際は、この関数群がPHP 5.1.0以降で使えないことを念頭に置いてください。 - PECL拡張としても実質的に入手困難 一時期はPECL拡張として別途インストールする方法もありましたが、mnoGoSearch自体のメンテナンスが停止して久しく、現代の環境でのビルドは現実的ではありません。
- 古いレンタルサーバーの案内を鵜呑みにしない 非常に古い技術記事やレンタルサーバーの案内ページにこの関数群への言及が残っていることがありますが、内容が現行のPHP環境に適用できない可能性が高いです。
- 「udm」という接頭辞から検索関数だと推測できても、用途を誤解しない
udm_add_search_limit()はあくまで「mnoGoSearchという特定の検索エンジン専用のクライアントAPI」であり、PHP標準の全文検索機能ではありません。array_filter()のような汎用配列関数と混同しないよう注意しましょう。 - 移行を検討する際は要件を整理する 単純なキーワード検索なのか、絞り込み検索(ファセット検索)が必要なのか、日本語の形態素解析が必要なのかによって、Elasticsearch・Meilisearch・データベースの全文検索機能のどれが適切かが変わってきます。
まとめ
| 観点 | まとめ |
|---|---|
| 何をする関数だったか | mnoGoSearch検索エンジンに対して、言語・カテゴリ・日付などの検索制限を追加する |
| 現在の状態 | PHP 5.1.0で本体から削除。現行のPHPでは使用不可 |
| 廃止の背景 | 外部ソフトウェアへの依存、利用者数の減少、代替技術の台頭 |
| 現代の代替 | Elasticsearch/OpenSearch、Meilisearch、データベースの全文検索機能など |
| 注意点 | 古い記事の情報を鵜呑みにしない、現行環境では関数自体が存在しないことを理解する |
udm_add_search_limit() は、PHPの歴史の中で使われていた興味深い機能ではありますが、現在アクティブに開発を行う上で使う場面はありません。もし古いコードベースでこの関数群を目にした場合は、レガシーな全文検索連携の名残として認識し、Elasticsearchやデータベースの全文検索機能など、現代的な代替手段への移行を検討することをおすすめします。
