2018年9月13日 エンジニアリング

Elastic App Searchで多言語エンジンを構築する

著者 Kellen EvanIoana Tagirta

Elastic App Searchエンジンは、特定の言語に最適になるよう設定できます。現在この機能は、英語、スペイン語、ドイツ語、デンマーク語、ロシア語、中国語、韓国語、日本語の13言語向けにリリースされています。

この記事では、各言語向けエンジンが検索メカニズムに変化を与える仕組みと、検索エクスペリエンスが向上する例、設定方法などをご紹介します。また、詳細なドキュメントもありますのでご参照ください。

解析とトークナイズ

検索するには、解析(アナライズ)を行う必要があります。最初の解析は、検索エンジン内のインデックスを構築する時に行われます。まずインデックスするプロセスで、ドキュメントのテキストがトークンに変換されます。このトークンは整理され、インデックスに対する索引語となります。

こうしてインデックスが構造化されると、検索クエリをかけることができるようになります。投入されたテキストは分析され、トークンに変換され、インデックスされた索引語とマッチさせることができるようになるわけです。投入されるクエリの単語とインデックスされた索引語が近似するほど、検索における関連性は高くなります。

たとえばElasticsearchを使って検索を構築する場合、対象言語をより深く、適切に扱うことができるカスタムアナライザーを1つ以上設定する必要があります。設定するアナライザーは、トークンを作成し、索引語を構築するメカニズムに直接関係します。アナライザーをそのまま使用すれば基本的なインデックスを作成できますが、より高度な設定を行うには、文字フィルターやトークナイザー、トークンフィルターのカスタマイズを求められることが一般的です。

Elastic App Searchにはそうした複雑な手順が必要なく、APIベースのソリューションで、対象となるアプリに最適な設定を行うことができます。ここでは中国語のケースを事例として取り上げ、App Searchのエンジンの解析メカニズムを詳しく解説します。

言語に即したエンジン

Elastic App Searchのエンジンの基本設定は全言語向けです。そのままでも十分動作し、多くのユースケースで最適な結果を出力できます。しかし、言語を指定した場合、アプリ検索エンジンはその言語に最適なカスタムアナライザーを使用します。

全言語向け設定のエンジンは賢くできており、各単語を独立に検索するのではなく、対象ドキュメントに合った連続の単語をクエリします。 たとえば「ホッケー」「スティック」を検索する場合、「ホッケー」と「スティック」をそれぞれ検索するのではなく、「ホッケースティック」で検索を実行してくれます。

この挙動は英語などの場合にとても便利ですが、他の言語では混乱を招くこともあります。

たとえば中国語で”給料”を意味する単語はこうです。

工资(=給料)

しかし、2つの漢字は単独ではそれぞれ”労働”と、”お金”という意味です。

(=労働)
(お金)

中国語用ではないアナライザーの場合、トークナイザーが2つの字をバラバラに扱い、2つのトークンを作成します。そして構文に関係なく、一致するものを機械的に探します。

この結果、中国語で給料のクエリを実行すると、ただ労働``金の字が並んでいただけでもヒットしてしまいます。これでは精度が高くなりません。

一般的なアナライザーは、英語のホッケースティックのように労働``金の関連性を考慮した結果を出力しようとします。しかし、中国語の場合、2つの漢字は、それぞれ単体ではまったく異なる意味を持っています。

一方、中国語用のアナライザーは、工资の2文字が1単語を形成していることを理解し、インデックス内で給料の1単語に対応する1つのトークンを作成します。これで工资給料の意味の1単語(バイグラム)として扱うことができ、労働金がヒットすることもありません。トークンが組み合わさることで、適切な単語を拾うことができるようになります。

Elastic App Search

Elastic App Searchでは、エンジンを作成する手順の中で言語を指定することができます。
App Search APIでアプリ検索エンジンを作成する場合のPOSTが、次の例です。この例では、中国語(zh)用のpandaというエンジンを作成しています。

curl -X POST 'https://host-xxxxxx.api.swiftype.com/api/as/v1/engines' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer private-xxxxxxxxxxxxxxxxxxxx' \
-d '{
  "name": "panda",
  "language": "zh"
}'

“language”で言語コードを指定します。ISO 639-1ISO 3166-1と同じIETF RFC 5646の言語コードを使用します。

GUIを使って検索エンジンを作成する場合、ダッシュボードからエンジンを作成するプロセスに言語セレクターがあり、指定できます。

Select language dropdown within Engine creation

検索エンジンがどの言語向けに設定されているかは、左上の検索エンジン名の下で確認することができます。言語が表示されていない場合は、全言語向けのアナライザーが使われています。

A Chinese language Engine named panda

検索エンジンを特定の言語向けに設定する手順はこれで全部です。他に特別必要となる手順はありません。これでデータがエンジンにインデックスされるたび、その言語に最適な高度な解析を実行することができます。その後このアナライザーで検索クエリを実行すると、関連性の高い結果を得られます。

まとめ

1つの値や、データタイプ、あるいは言語に着目してみても、検索はまだ発展途上の技術であり、そこにはさまざまなチャレンジがあることがわかります。その上、実際に行われる検索はもっと複雑です。多くの値を扱い、データタイプも、サポート言語も多岐にわたります。ゆくゆくは機械学習が予測したコンテクストに基づき、制御を行わなくても、あらゆる言語やデータタイプから正確な結果を出力できるアナライザーが誕生するかもしれません。

そんな未来が現実になるまでの間、アプリケーション検索の幅を広げてくれる効果的なソリューションがElastic App Searchです。直感に使えるダッシュボードから、シンプルでダイナミックな最新のAPIを使って優れた検索エクスペリエンスを構築でき、13の言語に最適なアナライザーを簡単に組み込むことができます。Elastic App Searchと各種APIは、14日間のトライアルに登録してお試しいただけます。

追記Elastic Site Searchも、多言語対応となりました。ドメインと言語を指定すると、対象ページをSite Search Crawlerがインデックスします。次にパッケージをインストール。これだけで、質の高い検索エクスペリエンスを構築できます。