Elasticsearch 7使用時の部分一致検索の動作変更について

問題

コンテンツフィールドの接頭辞による検索時の動作が変更されました。 タイトルフィールドで検索すると、引き続き動作します。

例えば、「legal」という単語が入ったコンテンツフィールドがあり、「leg」という接頭辞で検索した場合、以下のように動作が変化します。

  • Elasticsearch 6 の場合: コンテンツが見つかりました。
  • Elasticsearch 7 の場合: コンテンツが見つかりません。

タイトル欄の動作に変更はなく、タイトルに「legal」の単語があり、「leg」の接頭辞で検索した場合でも、コンテンツは検索可能です。

背景

技術的なレベルでは、Elasticsearch 7のクエリで変更を検出しました。以前は、ポータルはコンテンツフィールドで match_phrase_prefix 節を使って検索していましたが、現在はデフォルトで match_phrase 節になっています。 この変更は、Elasticsearch 6 と 7 の違いに起因するものであり、導入が必要でした。

Environment

  • DXP 7.3-7.4

  • DXP 7.2 と Elasticsearch 7 の組み合わせ

  • DXP 7.1 と Elasticsearch 7 の組み合わせ

解決策

この動作の変化は予想されることであり、ここにその全容を説明します。

1. クエリーの種類

Liferayには2種類のクエリタイプがあります。

  • title (TitleFieldQueryBuilder) =>match_phrase_prefix 節を使用。
  • description (DescriptionFieldQueryBuilder) => match_phrase 節を使用する。

2種類のクエリーを用意したのは、両方を差別化したいからです。

  • "title" タイプは、ユーザーがアセットのタイトルを検索することが多いと予想され、またタイトルが内容を示すことが多いため、より強く、詳細に検索されることを意図しています。
  • "description" 型は、内容が大きくなる可能性があり、より多くの関連情報を含むと予想されるため、あまり熱心に検索されないと予想されます。

各フィールドで使用するクエリタイプは、以下のLiferayのコードで決定します。

このコードでは、 FieldQueryBuilderFactoryImpl コンポーネントのプロパティ でフィールドが設定されており、設定されていないすべてのフィールドに対してデフォルトのクエリータイプが存在します。

2. Elasticsearch 6 と 7 のデフォルトのクエリタイプの相違点

FieldQueryBuilderFactoryImplコンポーネントで設定されていないすべてのフィールドには、デフォルトのクエリタイプが使用されます。

以下のLiferayのコードで取得します: https://github.com/liferay/liferay-portal/blob/ded0e9390637985231e962e4ad4cfa4639eabb26/modules/apps/portal-search/portal-search/src/main/java/com/liferay/portal/search/internal/query/field/FieldQueryFactoryImpl.java#L71

デフォルトのクエリタイプは、前述のパッチレベルおよびバージョン間で変更されます。

  • Elasticsearch 6 コネクタは、フィールドが設定されていなかった場合のフォールバッククエリータイプとして、 TitleFieldQueryBuilder を使用します。
  • Elasticsearch 7 コネクタの開発中に、正しいフォールバッククエリタイプは DescriptionFieldQueryBuilderであるべきだということが決まりました。

これは、フォールバッククエリが DescriptionFieldQueryBuilder に変更され、コンテンツフィールドが match_phraseを使用しているため、このバージョンの新しいデフォルト句であることを説明しています。

3. 動作を変更するためのサポートされていないワークアラウンド

警告 この回避策はサポートされていません。

FieldQueryBuilderFactoryImpl の動作を変更することができます match_phrase_prefix を他のフィールドに設定するには、カスタム値でそれを構成する この FieldQueryBuilderFactoryImpl OSGIコンポーネントのプロパティを設定します。

OSGiコンポーネントのカスタムプロパティを設定するには、このコミュニティのブログポストの指示に従うことができます。

FieldQueryBuilderFactoryImplにこの変更を適用する場合、 com.liferay.portal.search.internal.analysis.FieldQueryBuilderFactoryImpl.config[LIFERAY_HOME]/osgi/configs フォルダに作成し、 description.fields y title.fields を必要な値で作成しなければならな いでしょう。

重要: この設定変更は、サポートサービスの範囲外となるパーソナライゼーションとみなされます。

この記事は役に立ちましたか?
2人中1人がこの記事が役に立ったと言っています