日本語版
最新ニュース
企業

Optimizely の検索とナビゲーション – パート 1 – 検索のヒント

導入 検索とナビゲーションは、Optimizely が提供するクラウド サービスで、Optimizely CMS サイトと Optimizely Commerce サイトの両方の検索機能の構築をサポートします。このプラットフォームは、Elasticsearch の強力な機能を利用して、バックグラウンドで Elasticsearch を使用し、検索、フィルター、ファセット、インデックス作成機能を提供します。 私は、CMS プロジェクトとコマース プロジェクトの両方に検索とナビゲーションを適用した経験があります。そこで今日は、検索に関するヒントをいくつかご紹介します。 Optimizely CMSと検索とナビゲーションのどのバージョンですか この記事で使用しているプラットフォームのバージョンは、Optimizely CMS 12.27.x と EpiServer.Find 16.1.x です。 検索とフィルターの違い 検索コンセプト: Elasticsearch の検索コンセプトは、インデックスをクエリして特定の条件に一致するドキュメントを取得するプロセスを指します。 検索を実行すると、Elasticsearch はクエリとの一致度に基づいて各ドキュメントの関連性スコアを計算します。 検索クエリは、一致クエリ、用語クエリ、範囲クエリなどのさまざまなクエリ DSL (ドメイン固有言語) 構造を使用して実行できます。 検索結果は通常、関連性によって並べ替えられますが、特定のフィールドに基づいて並べ替え基準を指定することもできます。 フィルターのコンセプト: 一方、フィルターは、関連性スコアに影響を与えずに、クエリによって返されるドキュメントのセットを絞り込むために使用されます。 フィルターは通常、完全一致または範囲一致に使用され、最初の検索後にドキュメントに適用されます。…

Optimizely の検索とナビゲーション – パート 1 – 検索のヒント

1718688394
2024-05-22 03:59:03

導入

検索とナビゲーションは、Optimizely が提供するクラウド サービスで、Optimizely CMS サイトと Optimizely Commerce サイトの両方の検索機能の構築をサポートします。このプラットフォームは、Elasticsearch の強力な機能を利用して、バックグラウンドで Elasticsearch を使用し、検索、フィルター、ファセット、インデックス作成機能を提供します。

私は、CMS プロジェクトとコマース プロジェクトの両方に検索とナビゲーションを適用した経験があります。そこで今日は、検索に関するヒントをいくつかご紹介します。

Optimizely CMSと検索とナビゲーションのどのバージョンですか

この記事で使用しているプラットフォームのバージョンは、Optimizely CMS 12.27.x と EpiServer.Find 16.1.x です。

検索とフィルターの違い

検索コンセプト:

  • Elasticsearch の検索コンセプトは、インデックスをクエリして特定の条件に一致するドキュメントを取得するプロセスを指します。
  • 検索を実行すると、Elasticsearch はクエリとの一致度に基づいて各ドキュメントの関連性スコアを計算します。
  • 検索クエリは、一致クエリ、用語クエリ、範囲クエリなどのさまざまなクエリ DSL (ドメイン固有言語) 構造を使用して実行できます。
  • 検索結果は通常、関連性によって並べ替えられますが、特定のフィールドに基づいて並べ替え基準を指定することもできます。

フィルターのコンセプト:

  • 一方、フィルターは、関連性スコアに影響を与えずに、クエリによって返されるドキュメントのセットを絞り込むために使用されます。
  • フィルターは通常、完全一致または範囲一致に使用され、最初の検索後にドキュメントに適用されます。
  • フィルターを使用すると、特に頻繁に使用される静的な基準の場合、クエリのパフォーマンスを大幅に向上できます。
  • 検索クエリとは異なり、フィルターはスコア付けされないため、高速ですが、ドキュメントの一致に関しては柔軟性が低くなります。

要約すると、Elasticsearch からドキュメントを取得するために検索とフィルターの両方が使用されますが、検索はクエリに対して計算された関連性スコアに基づいてドキュメントを見つけるために使用され、フィルターは関連性スコアに影響を与えずにドキュメントのセットを絞り込むために使用されます。

contains 演算子を使用してフリーテキスト検索を適用する方法

次のようにワイルドカードを使用して、フリーテキスト検索に contains 演算子を適用できます。

query = query.For(searchTerm, options => {
    options.Query = $"*{searchTerm}*";
    options.AllowLeadingWildcard = true;
    options.AnalyzeWildcard = true;
    options.RawQuery = searchTerm;
});

先頭のワイルドカードを許可する: true の場合、ワイルドカード文字 * と ? がクエリ文字列の最初の文字として許可されます。デフォルトは true です。

ワイルドカードの分析: true の場合、クエリはクエリ文字列内のワイルドカード用語を分析しようとします。デフォルトは false です。

下の画像 フリーテキスト検索 – 演算子を含む – 名前フィールドで製品を検索した結果は次のとおりです。

検索語に複数の単語が含まれている場合のフリーテキスト検索の仕組み

実際、デフォルトで For メソッドを使用してフリーテキスト検索を実行すると、検索語は分離された単語に分析され、デフォルトでは OR 演算子を使用して分離された単語で検索が行われます。次の設定で演算子を AND に変更できます。

query = query.For(searchTerm, options => {
    options.DefaultOperator = EPiServer.Find.Api.Querying.Queries.BooleanOperator.And;
})});

または

query = query.For(searchTerm) }).WithAndAsDefaultOperator();

下の画像 フリーテキスト検索 – AND 演算子 – 名前フィールドで製品を検索した結果は次のとおりです。

注記: ここでの AND 演算子は、検索結果に順序に関係なく検索用語のすべての単語が含まれることを意味します。

フレーズ全体のフリーテキスト検索を適用する方法

入力した単語やフレーズとまったく同じ内容を検索したい場合があります。フレーズ全体にフリーテキスト検索を適用するには、次のようにフレーズを「{単語}」という形式で囲みます。

query = query.For($””{searchTerm}””);

下の画像 フリーテキスト検索(全フレーズ一致)で製品を検索した結果は、名前フィールド内です。

あいまい検索の適用方法

あいまい検索は、ユーザーが入力ミスをした場合でもコンテンツを検索したり、正確なキーワードだけでなく近似キーワードにも一致するすべての検索結果を返したい場合に使用できます。ただし、あいまい検索は通常のフリーテキスト検索ほどパフォーマンスが良くないため、本当にあいまい検索を使用するかどうかを検討する必要があります。

あいまい検索を適用するために使用した方法は次のとおりです。

まず、あいまいクエリを構築するための拡張メソッドを追加します

public static ITypeSearch FuzzySearch(this ITypeSearch search, string query, Expression> fieldSelector, double minSimilarity, int? prefixLength)
{
    return new Search(
        search,
        (ISearchContext context) =>
        {
            if (minSimilarity = 1)
            {
                return;
            }

            var boolQuery = new BoolQuery();

            boolQuery.MinimumNumberShouldMatch = 1;

            boolQuery.Should.Add(context.RequestBody.Query);

            var fieldNameForSearch = search.Client.Conventions.FieldNameConvention
    .GetFieldNameForAnalyzed(fieldSelector);

            var fuzzyQuery = new FuzzyQuery(fieldNameForSearch, query)
            {
                MinSimilarity = minSimilarity,
                PrefixLength = prefixLength,
                Boost = 0.5,
            };

            boolQuery.Should.Add(fuzzyQuery);

            context.RequestBody.Query = boolQuery;
        });
}

最小類似度: 結果に適合する最小の類似性が許容されることを意味する

プレフィックスの長さ: あいまい一致で変更されない先頭文字の数。デフォルトは 0 です。

ブースト: ファジークエリの関連性スコアの係数。デフォルトは 1 です。ただし、目的に応じて変更して、スコアに基づいてデフォルトの結果順序が期待どおりになるようにすることができます。

次に、このメソッドを検索オブジェクトに次のように使用できます。

query = query.FuzzySearch(searchTerm, x => x.Name, 0.5, 0);

下の画像 あいまい検索で商品を見つけたときの結果です – 類似度は0.5です – 名前フィールド内:

注記: このガイドに従ってあいまい検索を適用してみました https://docs.developers.optimizely.com/digital-experience-platform/v1.1.0-search-and-navigation/docs/fuzzy-search しかし、それは私にはうまくいきません。後で時間をかけて深く掘り下げて理由を見つけるつもりです。

AND/OR演算子を使用して複数の検索クエリを適用する方法

クエリが複数あり、それらに対して AND/OR 演算子を定義する必要がある場合は、BoolQuery を使用できます。

OR に BoolQuery を使用する方法は次のとおりです。

var boolQuery = new BoolQuery();

boolQuery.MinimumNumberShouldMatch = 1;

boolQuery.Should.Add(subQuery);

AND に BoolQuery を使用する方法は次のとおりです。

var boolQuery = new BoolQuery();

boolQuery.Must.Add(subQuery);

または否定クエリの場合はAND

var boolQuery = new BoolQuery();

boolQuery.MustNot.Add(subQuery);

結論

私の意見では、アプリケーションに検索ソリューションが必要な場合、Search & Navigation を使用するのが依然として良い選択です。これは、検索、フィルタリング、ページング、ファセット、統計などのさまざまな機能をサポートする Elasticsearch をバックグラウンドで使用します。上記の検索のヒントが、Search & Navigation をプロジェクトに適用する際に役立つことを願っています。

2024年5月22日

#Optimizely #の検索とナビゲーション #パート #検索のヒント

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。