WordPressのエクスポートでTypeErrorになる

PHP 8.3にバージョンアップしたところ、WordPressのコンテンツデータのエクスポートがエラーになった。

エラー内容

エクスポートを実行すると以下のようなFatal errorが発生する。

PHP Fatal error:  Uncaught TypeError: wp_is_valid_utf8(): Argument #1 ($bytes) must be of type string, null given called in wp-admin/includes/export.php on line 246

原因

PHP 8.3で型チェックが厳格化されたため、wxr_cdata()関数にNULLが渡された場合にFatal errorとなる。PHP 8.2まではwarningで済んでいたが、8.3で致命的エラーになった。

対処方法

wp-admin/includes/export.phpwxr_cdata()関数を修正し、NULLが渡された場合に空文字列として扱うようにする。

245行目付近のwxr_cdata()関数の先頭に以下のチェックを追加する。

function wxr_cdata( $str ) {
    if ( $str === null ) {
        $str = '';
    }

Docker ComposeでWordpressを利用している場合

Docker Composeで運用している場合は、以下のコマンドで対象のコンテナ(ここではwordpressというコンテナ名)に対して修正を適用できる。

docker compose exec wordpress sh -c '
sed -i "
/function wxr_cdata( \$str ) {/a\\
\\
    // PHP 8.3 compatibility fix\\
    if ( ! is_string( \$str ) ) {\\
        \$str = \"\";\\
    }\\
" /var/www/html/wp-admin/includes/export.php
'

注意点

WordPressのアップデート時にこの修正は上書きされるため、アップデート後に再発するようであれば、再度適用が必要になる。WordPress本体で修正されるまでの暫定対応として利用する。

リモート環境でgh auth loginをする

SSHでサーバーにログインしている場合など、ブラウザが利用できないリモート環境でGitHub CLIの認証を行う方法をメモしておく。

通常、gh auth loginを実行するとブラウザが自動で開いて認証を行うが、リモート環境ではブラウザを開くことができない。そこで、環境変数BROWSER=falseを設定して実行する。

$ BROWSER=false gh auth login

するとワンタイムコードが表示されるので、ローカルPCなど任意のブラウザで以下のURLを開く。

https://github.com/login/device

表示されたワンタイムコードを入力すれば認証が完了する。

search-ann-benchmarkにベクトル検索エンジンを追加

ベクトル検索エンジンの性能評価ツールsearch-ann-benchmarkに、4つのエンジンを追加しました。

追加したエンジン

今回追加したのは以下の4つです。

ClickHouse

ClickHouseは、高速なOLAPデータベースとして知られていますが、最近はベクトル検索機能も提供しています。今回の実装では、MergeTreeエンジンとvector_similarityインデックスを使って、HNSW(Hierarchical Navigable Small World)によるANN検索を行います。

ClickHouseはHTTPインターフェースを介して操作でき、大量のデータをバッチ処理するのに向いています。既存のClickHouse環境があれば、追加のインフラなしでベクトル検索を始められるのがメリットです。

LanceDB

LanceDBは、組み込み型のベクトルデータベースです。SQLiteのようにファイルベースで動作するため、Dockerなどのコンテナを立ち上げる必要がありません。

Python環境で直接動作するため、セットアップが簡単で、ローカル環境でのプロトタイピングやテストに便利です。IVF-PQインデックスを使った近似最近傍探索をサポートしています。

Redis Stack

Redis Stackは、RedisにベクトルDB機能を追加したものです。RediSearchモジュールを使って、HNSWインデックスによるベクトル検索ができます。

Redisはインメモリデータベースなので、検索速度は高速です。既存のRedisインフラを活用できる点と、KVストアとしての機能とベクトル検索を同じ基盤で使えるのが特徴です。

Vald

Valdは、Yahoo! JAPANが開発した分散ベクトル検索エンジンです。NGT(Neighborhood Graph and Tree)というアルゴリズムを使っており、高次元ベクトルに対して高い性能を発揮します。

Kubernetesネイティブなアーキテクチャで、大規模な分散環境での運用を想定した設計になっています。gRPCベースのAPIを提供しています。

ベンチマーク実行

各エンジンのベンチマークはGitHub Actionsで自動実行されるようになっています。手動でトリガーすることも可能で、100k、1M、5Mのデータセットサイズに対してテストできます。

これで、search-ann-benchmarkでサポートするエンジンは合計12種類になりました。

  • Elasticsearch
  • OpenSearch
  • Qdrant
  • Milvus
  • Weaviate
  • Vespa
  • pgvector
  • Chroma
  • ClickHouse(New)
  • LanceDB(New)
  • Redis Stack(New)
  • Vald(New)

ベクトル検索エンジンは選択肢が増えてきているので、自分の用途に合ったものを選ぶ際の参考になればと思います。

関連リンク