DEV Community

e_ntyo
e_ntyo

Posted on

Elasticlunr.js で日本語と英語が混在した文書の検索に対応する

tl; dr

Elasticlunr.jsで英語以外の言語に対応するためにはweixsong/lunr-languagesを使う必要がありますが、このライブラリは2019/04/27現在、日本語+他の言語の組み合わせ(複数言語からなる文書の検索)に対応できていません。正確には、サポートしていると書いてありますがこの組み合わせでは動きません。

weixsong/lunr-languages にパッチ的なPRを出しているので、同じ現象で困っている方がいらっしゃいましたらご確認ください。

背景

高速な全文検索を行うための軽量なJavaScriptライブラリとして Elasticlunr.js があります。こちらは標準では英語のみに対応しているため、日本語に対応するためには一手間必要です。これは軽量さを売りにしているライブラリとして正しいやり方でしょうし、やり方も公式ドキュメントやブログ記事に丁寧に書かれています。

デフォルトでは、英語での検索しか出来ない。
多言語対応プラグインを組み込めば、日本語で検索できる様になる。
lunrの多言語対応プラグインをElasticlunr向けにフォークした物を使用する。
weixsong/lunr-languages
※ lunr-languagesリポジトリは2つあるので注意。
MihaiValentin/lunr-languagesはlunr用であり、Elasticlunrで使用するとエラーが発生する。
weixsong/lunr-languagesを使用する必要がある。

【JSの全文検索エンジン】elasticlunr.jsを触ってみた~インストールからパイプライン、日本語対応など~ by @well

ですが、日本語に加えて英語など他国の言語にも対応する場合(これは、例えば検索クエリを 東京スカパラダイスオーケストラ MONSTER ROCK などとして、日本語と英語が混在する文書に対して検索を行う場合のことを指します)については、weixsong/lunr-languagesの実装が不十分でありが対応できていませんでした。

elasticlunrというJSの全文検索ライブラリを今触ってるんだけど、多言語対応辛そう
lunr(elasticlunrのベースとなったライブラリ)の多言語対応プラグイン使ってねとなっているが、elasticlunrとlunrのIFが噛み合ってなくて言語によっては動かないという
— うぇる (@well_itskill) 2019年1月22日

例えば、weixsong/lunr-languages のサンプルコードではロシア語と英語の両方に対応する例が挙げられていますが、このどちらかを日本語に変えると動かなくってしまいます。

これはfork元のMihaiValentin/lunr-languagesでは実装されている、日本語の文書のトークンを正規化する機能(trimmerと呼ばれます)weixsong/lunr-languagesでは未実装であるためです。よくよく見てみるとweixsong/lunr-languages は5年前に更新が止まっているようなリポジトリであり、このようなことが起こっても何らおかしくはないのですが。

余談ですが、私が Elasticlunr.js を使うことになったのは Gatsby.js が検索に対応するためのプラグインとしてgatsby-contrib/gatsby-plugin-elasticlunr-searchを提供しているためです。こちらをforkして内部で weixsong/lunr-languages を噛ませることで複数言語に対応させています。私の周りでGatsby.js自体を使っている人はよく見かけるので、同じ悩みを抱えている人がいたりいなかったりするかもしれないと思ってこの記事を書きました。

https://pbs.twimg.com/media/D2HyrDbVAAAYBM1.jpg

— Mark Dalgleish (@markdalgleish) 2019年3月20日

Discussion (0)