サイト内検索をElasticSearchベースのSearchly Starterに変えてみる → 失敗

Wordpress

≪≪この記事をすべて読むには約 19 分かかります≫≫

サイト内検索はWordpressの標準のものを使い続けてきました。当サイトは標準検索で問題ありません。

当サイトではなく、作成中のウェブサイトでもう少し高度な検索機能を使いたくなり調べていたところ、ElasticSearchに行き当たりました。まずはElasticSearchを使っている「Searchly」を無料の「Starter」プランでへ導入してみて、当サイトでのリソースの必要量を見て本格的に導入するプランをたてたいと思ってやってみましたが、失敗しました。見積もりが甘かったです。

Searchly

SearchlyはトルコのIT系企業Sebulaが運営しています。

Searchly service page

Sebulaは検索、機械学習、ビッグデータ関連のサービスを提供している会社です。

Sebula is a software as a service provider focusing on Search, Machine Learning, Big Data products. We also provide professional consulting services around Mahout, Hadoop, ElasticSearch/Lucene and NoSql systems. Our goal is to help businesses get higher value from their data and become information driven.(SebulaのLinkedInより)

無料プランを除くと、月額9米ドルからのサービスです。

プラン名インデックス数容量月額料金
Starter220 MB無料
Micro31 GB9 USD
Small53 GB19 USD
Advanced910 GB59 USD
Professional1330 GB99 USD
Business1860 GB1,99 USD
Enterprise22140 GB3,99 USD
Extended44300 GB7,99 USD

Microプランでも2023年5月の為替レートで1240円(134円/USD時)で、恐らくここに税金などが加わると思いますので、競合サービスより高額です。

Searchly Starterの初期設定

まず、サイトにアクセスして「Sign up」します。組織名は入れなくても大丈夫でした。

メールアドレスとパスワードを登録すると、登録したメールアドレスに確認メールが届きます。私は最初迷惑メールに振り分けられていました。リンクをクリックするとログインできるようになります。

creating spaces

ログインすると、最初にサーチスペースというのを作成することになります。保存スペースを初期設定の「EU」から「US」へ変えて、適当に名前を付けました。

スペースの設定が終わると、ダッシュボードが出てきます。サブスクリプションとして「Starter」(無料プラン)が表示されていて、データ制限20MB(2023年5月現在の無料プラン上限)が出ています。

ダッシュボードから「indices」(インデックス)を選び「New index」で新規作成します。ダッシュボードの「Connection」からAPIキーとアクセス先を表示させます。

WordPressのプラグイン選定

Searchlyを使うための検索プラグインを探します。ElasticPressを使ってElasticSearchを導入したという記事があったので参考にします。そのままだと日本語検索には足りなくて、「analysis-kuromoji」「analysis-icu」を入れると良いとか・・・。

サーバー側にプラグインを入れて、ElasticPressのプラグインから使う設定をしているので、これはSeachlyを使っていては実現できなさそうです。設定を色々いじるのはどこをどうしたら良いかわからないので、機能的にはGoogleカスタム検索の方が良い可能性もありますね。

WordPressでElasticSearchが使えそうなプラグインを見ていきます。

ElasticSearch関連プラグインリスト

2023年5月18日時点で検索すると、

プラグイン名インストール数評価最終更新
ElasticPress7000+(29)4週間前
JetPack500万+(1878)2週間前有料
JetPack
WP Search with Elasticsearch10未満(3)4年前
Fantistic ElasticSearch80+(9)7年前
WP Simple Elasticsearch10+(0)7年前
Kumihimo10未満(0)5年前
Elasticommerce Search Form10未満(0)7年前
Elasticommerce Related Items10未満(0)7年前
Swiftype Site Search Plugin for WordPress1000+(24)2年前有料
Swiftype

数が結構でてきたので期待して見てみましたが、更新が7年前とか5年前とかばかりです。ここ数年で更新しているのが、ElasticPressとJetPack、Swiftypeです。JetPackはとてもよく聞くプラグインですが、月額1065円の有料機能としてサイト検索が追加できるというものですので、今回は対象外です。Swiftypeも独自のElasticSearchサービスなので除外すると、ElasticPress一択でした。WordPressはプラグインが充実していますが、思ったよりも見つからなくてびっくりしました。

探し方が悪いかもしれませんが、WordPressのプラグインって検索が使いにくいんですよね。

ElasticPressの設定

設定をして走らせてみたら、エラーで停止しました。

PHP Fatal error:  Uncaught TypeError: Cannot access offset of type string on string in /tek2tech.com/wp-content/plugins/elasticpress/includes/classes/Stats.php:158

該当部分を見てみると、

	/**
	 * Populate the instantiated object with the correct indices, based on context
	 *
	 * @since 3.x
	 */
	private function populate_indices_stats() {
		$network_activated = defined( 'EP_IS_NETWORK' ) && EP_IS_NETWORK;
		$blog_id           = get_current_blog_id();
		$site_indices      = $this->get_indices_for_site( $blog_id );

		$indices = $this->remote_request_helper( '_cat/indices?format=json' );

		if ( empty( $indices ) ) {
			return;
		}

		// If the plugin is network activated we only want the data from the indexable WP indexes, not any others.
		if ( $network_activated ) {
			$indexable_sites = Utils\get_sites();
			foreach ( $indexable_sites as $site ) {
				$indexables   = $this->get_indices_for_site( $site['blog_id'] );
				$site_indices = array_merge( $site_indices, $indexables );
			}
		}

		// Filter the general list of indices to contain only the ones we care about.
		$filtered_indices = array_filter(
			$indices,
			function ( $index ) use ( $site_indices ) {
				return in_array( $index['index'], $site_indices, true );
			}
		);

		/**
		 * Allow sites to select which indices will be displayed in the Index Health page
		 *
		 * @param   {array} $filtered_indices Indices filtered to the site(s) being queried.
		 * @param   {array} $indices          All indices returned from Elasticsearch
		 *
		 * @return  {array} List of indices to use
		 *
		 * @since   3.x
		 * @hook    ep_index_health_stats_indices
		 */
		$filtered_indices = apply_filters( 'ep_index_health_stats_indices', $filtered_indices, $indices );

		foreach ( $filtered_indices as $index ) {
			$this->populate_index_stats( $index['index'], $index['health'] );
		}
	}

// Filter the general list of indices to contain only the ones we care about.
$filtered_indices = array_filter( $indices,
  function ( $index ) use ( $site_indices ) {
    return in_array( $index['index'], $site_indices, true );
  }
);

のreturn内で起こっているようです。配列の中の文字列に配列アクセスしようとしているというエラーです。

PHPバージョンをいじってみたり、色々してみましたが動きません。

データ容量がかなり必要

そもそも、20MBでインデックスしきれるのかという疑問がわき、調べてみました。探していくと、ElasticSearchには最低限でデータ容量x3.4倍、インデックスの指定によってはデータ容量x5.1倍のサイズが必要という話が出てきました。

データベースサイズは420MB、サイトのバックアップ上のSQLサイズは240MBありました。

SQL命令文が入っているので参考程度ですが、日本語検索をしなくてもSQLファイルサイズを基に計算すると少なくとも820MB、できれば1.2GBは欲しいということです。SQL命令文の部分を考えてかなり減るとしても、少なくとも500MB級のデータ領域は必要そうです。20MBでは明らかに無理です。

そうすると、やはりSearchlyを使うなら最低限レベルのMicroプラン月額9USD、1GBでちょうど良いくらいになるか、日本語検索をしたいなら足りないレベルと思います。

フレッシュインストールでやってみた

そのまま諦めるのは悔しいので、英語版WordPressを新しくインストールして試してみました。

タイトル:Hello World!

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

このデフォルト投稿だけのサイトに対してElasticPressをSearchlyに向けて設定したところ、インデックスの作成に成功しました。

ElasticPress initial indexing succeeded

が、実行時エラーで止まってしまうのは変わらなかったので、何かしら現状のMariaDBバージョンとPHPバージョン、その他何かの制限で動かないのだと思います。

コメント

タイトルとURLをコピーしました