5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita株式会社Advent Calendar 2023

Day 20

[tips]Elasticsearchのハイライトが破損している時の対処法

Last updated at Posted at 2023-12-19

Elasticsearchのハイライト機能を利用する際、ハイライトが破損した状態で返却してくることがあります。
一つの原因として考えられるのが、ハイライトのフラグメントを生成する際、サロゲートペアを1文字ではなく2文字としてカウントしてしまい、ハイライト生成の条件によってはサロゲートペアの文字コードの前半(上位サロゲート)のみを読み込んでしまうことです。
これは2019年にElasticsearchへ報告され、その後Luceneにtransferされましたが、いまだに修正されていません。

ただ、いくつか対策は存在するため、今回はそちらを紹介します。

number_of_fragmentsを0にする

ハイライトにはnumber_of_fragmentsというオプションが存在し、返却するハイライトの数を指定することができます。
しかし、これを0にすることでハイライトを返す場合本文全てを返すようになります。フラグメントに切る処理をしないのでサロゲートペア問題が発生しないというわけですね。
本文の長さがある程度短い場合はこちらを検討するのも良いでしょう。

boundary_scannerをwordかsentenceにする

boundary_scannerというオプションはfragmentの切れ目を指定することが可能です。
charswordsentenceの3オプションが存在します。
charsの場合はfragment_sizeに到達するとそこを切れ目にしますが、wordsentenceにすることで切れ目を単語や文の終わりに調節することができます。
現在、charsだと先述のバグが発生してしまうため、こだわりがなければwordsentenceにすると良いでしょう。

boundary_scannerでchars以外を設定する場合はboundary_scanner_localeを設定する

boundary_scannerwordsentenceにすることで、fragmentを単語や文の終わりで切ってくれますが、言語によって切る基準は異なるので指定してあげる必要があります。
この場合、boundary_scanner_localeオプションを使います。
日本語の場合はja-JP、英語の場合はen-USを指定しましょう。

まとめ

ハイライトはオプションが多くハイライターによってデフォルト値が異なったりするため、どのオプションがどう効くのか整理して適用してあげることが大切です。
Elasticsearchの場合、公式ドキュメントが相当親切で、注釈などに引っかかりポイントや設計の考え方を書いてくれているため、そちらもしっかり目を通して先人の知恵を有効活用していきましょう :muscle:

REF

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?