Solr自動提案の使用

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

メモ

このトピックはSitecore 9.0以降で有効です。

Solrには、SuggestComponentという "suggester" コンポーネントがあります。このコンポーネントを使用して、クエリ用語の自動提案をユーザーに提供できます。たとえば、オートコンプリート機能を備えたテキスト ボックスを作成し、ユーザーがテキスト ボックスにクエリ用語を入力すると、候補となる用語が表示されるとします。

Solrのスペルチェック機能を使用して、自動提案を実装することもできます。専用のSuggesterComponentはLuceneのsuggester実装を使用し、Luceneで使用可能なすべてのルックアップ実装をサポートします。スペルチェック機能を使用するときに、結果の他の側面を構成することもできます。

詳細については、こちらをご覧ください。

https://wiki.apache.org/solr/Suggester

https://cwiki.apache.org/confluence/display/solr/Suggester

ルックアップの実装

solrConfig.xmlファイルのlookupImplパラメータを使用して、suggestインデックス内の用語の検索に使用するルックアップアルゴリズムを指定します。いくつかの実装から選択できます。これらはすべてLookupクラスのサブクラスであり、一部のサブクラスでは追加のパラメーターを構成する必要があります。

  • JaspellLookup: Jaspellに基づくツリーベースの表現。

  • TSTLookup: データ構造を即時に更新できる三項ツリーベースの表現。

  • FSTLookup: オートマトンベースの表現。ビルドが遅くなりますが、実行時に消費するメモリははるかに少なくなります。

  • WFSTLookup: 加重オートマトン表現。よりきめ細かなランキングのためのFSTLookupの代替手段。

辞書の実装

solrConfig.xmlファイルのdictionaryImplパラメーターを使用して、候補インデックスに用語を格納するために使用するディクショナリ実装を指定します。いくつかの実装から選択できます。これらはすべて、DictionaryFactoryクラスのサブクラスです。

  • DocumentDictionaryFactory: インデックスから取得した用語、重み、およびオプションのペイロードを含むディクショナリ。

  • DocumentExpressionDictionaryFactory: DocumentDictionaryFactoryと同じディクショナリ実装ですが、ユーザーはweightExpressionタグで任意の式を指定できます。

  • HighFrequencyDictionaryFactory: このディクショナリの実装では、非常に一般的な用語が他の用語を圧倒する可能性がある場合に、頻度の低い用語を剪定するためのしきい値を追加できます。

  • FileDictionaryFactory: このディクショナリ実装では、推奨されるエントリを含む外部ファイルを使用できます。ウェイトとペイロードを使用することもできます。

手記

1つのSuggesterComponentに複数のディクショナリを含めることができます。リクエスト時に、使用する辞書を指定する必要があります。

Solrでの自動提案の設定

auto-suggestを使用するには、SuggesterComponentと要求ハンドラを追加して構成する必要があります。

SuggesterComponentを追加して構成する

SuggesterComponent検索コンポーネントは、いくつかの設定パラメータを受け入れます。ルックアップ実装の選択項目 (lookupImpl) と辞書実装の選択項目 (dictionaryImpl) によって、必要なパラメータの一部が決まります。

次のサンプルは、指定するルックアップまたはディクショナリの実装に関係なく使用できる一般的なパラメーターを示しています。

<searchComponent name="suggest" class="solr.SuggestComponent">
  <lst name="suggester">
    <str name="name">mySuggester</str>
    <str name="lookupImpl">FSTLookupFactory</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">myFieldName</str>
    <str name="suggestAnalyzerFieldType">string</str>
    <str name="buildOnStartup">false</str>
  </lst>
</searchComponent>

SuggesterComponentパラメーター

パラメーター

形容

searchComponentの名前

検索コンポーネントの任意の名前。

名前

このサジェスタの象徴的な名前。

ルックアップインプリ

ルックアップの実装。指定しない場合、デフォルトのルックアップ実装はJaspellLookupFactoryです。

dictionaryImpl

使用するディクショナリの実装。指定しない場合、sourceLocationが使用されていない限り、デフォルトのディクショナリ実装はHighFrequencyDictionaryFactoryされます。この場合、ディクショナリの実装はFileDictionaryFactoryになります。

提案用語のベースとして使用するインデックスのフィールド。 sourceLocationが空の場合、このインデックス フィールドの用語が使用されます。

このフィールドは、提案のベースとして使用するために保存する必要があります。 copyFieldルールを使用して 、ドキュメント内の他のフィールドの用語で構成される特別な "suggest" フィールドを作成できます。

フィールドの分析は最小限にとどめる必要があるため、基本的なトークナイザーまたはフィルターのみを使用するフィールドタイプをスキーマに作成することもできます。

ソースロケーション

ディクショナリファイルへのパス ( FileDictionaryFactoryを使用している場合)この値が空の場合、メインインデックスが項と重みのソースとして使用されます。

ストアディレクトリ

辞書ファイルが格納されているフォルダ。

buildOnCommitまたはbuildOnOptimize

trueの場合、ルックアップ・データ構造はソフト・コミット後に再構築されます。false (デフォルト) の場合、ルックアップ データ構造はURLパラメーター suggest.build=trueによって要求された場合にのみ構築されます。

buildOnCommitを使用して、ソフト コミットごとにディクショナリを再構築するか、buildOnOptimizeを使用して、インデックスが最適化された場合にのみディクショナリを構築します。

一部のルックアップ実装は、特に大きなインデックスの場合、構築に時間がかかる場合があります。このような状況では、buildOnCommitまたはbuildOnOptimizeを、特にsoftCommitsの頻度が高い場合はお勧めしません。代わりに、suggest.build=trueを使用して手動でリクエストを発行して、サジェスタを低い頻度で構築することをお勧めします。

buildOnStartupの

trueの場合、ルックアップ データ構造はSolrの開始時またはコアの再読み込み時に構築されます。

このパラメータを指定しない場合、SuggesterComponentはルックアップ・データ構造がディスク上に存在するかどうかをチェックし、見つからない場合は構築します。

これをtrueに設定すると、suggesterデータ構造を構築する必要があるため、コアのロード (またはリロード) に長くなる可能性があります。これには時間がかかる場合があります。通常、この設定をfalseに設定し、suggest.build=trueを使用して手動でリクエストを発行するサジェスタを作成することをお勧めします。

この設定をtrueにすると、コアのロードとリロードに時間がかかる場合があります。これは、suggesterデータ構造が起動時に再構築されるためです。したがって、falseに設定し、suggest.build=trueを使用してサジェスタを手動でビルドすることをお勧めします。

リクエストハンドラ

solrconfig.xmlファイルを編集し、リクエストハンドラを追加する必要があります。この要求ハンドラは、他の要求ハンドラと同じように機能します。これを使用して、提案要求を処理するためのデフォルトパラメータを設定します。リクエストハンドラ定義には、SuggesterComponentを組み込む必要があります。

<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
  <lst name="defaults">
    <str name="suggest">true</str>
    <str name="suggest.count">10</str>
  </lst>
  <arr name="components">
    <str>suggest</str>
  </arr>
</requestHandler>

リクエストハンドラパラメータ

これらのパラメータを指定して、要求ハンドラのデフォルトを設定できます。

パラメーター

形容

提案する

このパラメーターは常にtrueにする必要があります。これは、このハンドラーに送信されたクエリのSuggesterComponentを常に実行する必要があるためです。

suggest.dictionaryの

検索コンポーネントで設定されているディクショナリコンポーネントの名前を指定します。このパラメータは必須です。リクエストハンドラで設定することも、クエリ時にパラメータとして送信することもできます。

提案.q

候補の検索に使用するクエリを指定します。

suggest.count

Solrが返す候補の数を指定します。

提案.cfq

Solrがコンテキスト・フィールドに基づいて候補をフィルタリングするために使用するコンテキスト・フィルター・クエリーを指定します (suggesterでサポートされている場合)。

提案.ビルド

trueの場合、Solrはsuggesterインデックスを構築します。これはおそらく最初のリクエストにのみ役立ちます。すべてのリクエストでディクショナリを構築することは望ましくありません (特に本番環境では)。

検索コンポーネントのbuildOnCommitパラメータまたはbuildOnOptimizeパラメータを使用して、インデックスを最新の状態に保ちます。

suggest.reloadさん

trueの場合、Solrはsuggesterインデックスを再読み込みします。

suggest.buildすべて

trueの場合、Solrはすべてのサジェスタインデックスを構築します。

suggest.reloadすべて

trueの場合、Solrはすべてのsuggesterインデックスを再読み込みします。

Sitecoreとの併用

Sitecoreには、Solrのサジェスター機能にアクセスするために使用するAPIがあります。このAPIは、既存のContentSearch APIの拡張機能として設計されています。

プロジェクトでAPIを使用するには、次の手順に従います。

  1. 次のDLLファイルをプロジェクトで参照します。Sitecore Webサイトのbinフォルダーから取得できます。

    • SolrNet.dll

    • Sitecore.ContentSearch.dll

    • Sitecore.ContentSearch.SolrProvider.dll

    • Sitecore.ContentSearch.SolrNetExtension.dll

  2. 次の名前空間をインポートします。

    • Sitecore.ContentSearch.SolrNetExtension (SuggesterComponentの実装を含むSolrNetの拡張機能)

    • Sitecore.ContentSearch.SolrProvider.SolrNetIntegration (ISearchIndexを拡張するメソッドを含む)

これで、Suggest APIをISearchIndexの一部として使用できるようになりました。

  1. 型のクエリ オブジェクトを作成します SolrSuggestQuery

  2. IProviderSearchContext.Suggest()メソッドを呼び出し、返された結果を型SolrSuggestHandlerQueryResults.

返される結果は、Keyが候補に使用される辞書名、Valueが候補の一覧と共に見つかった用語の数を表すSuggestResultオブジェクト (IEnumerable<Suggestion>) Dictionary<string, SuggestResult>です。

Suggestionオブジェクトには、提案された用語、重み、およびペイロードが含まれています。

例えば:

APIドキュメント

Suggest(SolrSuggestQuery, SuggestHandlerQueryOptions)

指定されたクエリに一致する用語を提案します。

構文

public static SolrSuggestHandlerQueryResults Suggest(
 this IProviderSearchContext context, 
 SolrSuggestQuery q, 
 SuggestHandlerQueryOptions options
)

パラメーター

  • 文脈

    種類: Sitecore.ContentSearch.IProviderSearchContext

    検索プロバイダーのコンテキスト

  • q

    種類: Sitecore.ContentSearch.SolrNetExtension.SolrSuggestQuery

    クエリ オブジェクト

  • オプション

    種類: Sitecore.ContentSearch.SolrNetExtension.SuggestHandlerQueryOptions

    クエリオプション

備考

このメソッドは、定義されたオプションのセット (2番目のパラメーター) を使用してSolrに対してクエリ (最初の引数) を実行し、結果を値のディクショナリとして取得します。

次の例は、基本的な使用方法を示しています。

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Web.Services" %>
<%@ Import Namespace="Sitecore.ContentSearch.SolrProvider.SolrNetIntegration" %>
<%@ Import Namespace="Sitecore.ContentSearch" %>
<%@ Import Namespace="Sitecore.ContentSearch.SolrNetExtension" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Suggester demo</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
  <script runat="server">
    [WebMethod]
    public static IEnumerable<string> GetSuggestion(string term)
    {
      using (var ctx = ContentSearchManager.GetIndex("sitecore_master_index").CreateSearchContext())
      {
        SolrSuggestQuery q = term;
        var options = new SuggestHandlerQueryOptions
        {
          Parameters = new SuggestParamaters
          {
            Count = 3,
            Build = true
          }
        };
        var result = ctx.Suggest(q, options);
        return result.Suggestions["mySuggester"].Suggestions.Select(a => a.Term);
      }
    }
  </script>
</head>
<body>
  <form id="form1" runat="server">
    <div class="ui-widget" align="center">
      <input type="text" id="searchTextBox" style="width: 80%;" placeholder="Enter your item name" />
    </div>
    <script type="text/javascript">
      $("#searchTextBox").autocomplete({
        source: function (request, response) {
          var param = { term: $('#searchTextBox').val() };
          $.ajax({
            url: "SuggestDemo.aspx/GetSuggestion",
            data: JSON.stringify(param),
            dataType: "json",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataFilter: function (data) { return data; },
            success: function (data) {
              response($.map(data.d,
                  function (item) {
                    return {
                      value: item
                    }
                  }));
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
              alert(textStatus);
            }
          });
        },
        minLength: 2
      });
    </script>
  </form>
</body>
</html>
この記事を改善するための提案がある場合は、 お知らせください!