演習 4:ParamSets の使用

演習 4:ParamSets の使用

この演習では、ParamSets を使用して多数の異なるクエリパラメータをラベル付きのグループにまとめ、クエリで参照する方法を学習します。

準備

tutorial-films.adoc#restart-solrの手順に従って、Solr を実行していることを確認してください。その後、次のセクションに進みます。

新規コレクションの作成

$ bin/solr create -c films

ConfigSet を指定しなかったため、_default ConfigSet が使用されます。Solr がそれ以外に異なる方法で推測する(私たちが望むよりも)いくつかのフィールドの特定のスキーマを指定します。

$ curl https://127.0.0.1:8983/solr/films/schema -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field" : [
    {
      "name":"name",
      "type":"text_general",
      "multiValued":false,
      "stored":true
    },
    {
      "name":"initial_release_date",
      "type":"pdate",
      "stored":true
    }
  ]
}'

これらのフィールドタイプを明示的に定義しないと、name フィールドは複数値の文字列フィールドタイプとして、initial_release_date フィールドは複数値のpdateタイプとして推測されます。この特定のデータセットドメインでは、映画名は単一値の一般的な全文検索可能なフィールドとして、公開日は単一値として扱う方が理にかなっています。

データのインデックス作成

スキーマを更新したので、サンプルの映画データのインデックスを作成する必要があります。既にインデックスを作成している場合は、追加した新しいフィールド定義を利用するために再インデックスを作成します。

Linux/Mac

$ bin/solr post -c films example/films/films.json

Windows

$ bin/solr post -c films example\films\films.json

検索を始めましょう!

'Batman' を検索

  • name フィールドが存在しないというエラーが発生する場合は、まだデータのインデックスを作成していません。

  • エラーは発生しないが、結果がゼロの場合、name フィールドのスキーマタイプのオーバーライドがデータの最初のインデックス作成前に設定されていない可能性があります(「string」タイプになり、大文字と小文字を区別した正確な一致が必要になります)。環境をリセットしてやり直すのが最も簡単で、各手順が正常に実行されるようにします。

すべての 'スーパーヒーロー' 映画を表示

$ curl 'https://127.0.0.1:8983/solr/films/query?q=*:*&fq=genre:"Superhero movie"'

すべての映画におけるジャンルの分布を見てみましょう。カウントについては、レスポンスのファセットセクションを参照してください。

$ curl 'https://127.0.0.1:8983/solr/films/query?q=*:*&facet=true&facet.field=genre'

ParamSets を使用した関連性の調整

データのクエリを実行できるようになったので、ParamSets を使用してパラメータを 2 つのエクスペリメントに整理してみましょう。

'harry potter' を検索

最初の結果が映画「アダムス・ファミリー2」であることに注目してください。これは明らかにハリーポッターの映画とは関係ありません。

API を使用して関連性アルゴリズムを 2 つ設定し、結果の品質を比較してみましょう。アルゴリズム Adismaxqf パラメータを使用し、アルゴリズム Bdismaxqf、および 100% に設定された必須一致 mm を使用します。

curl https://127.0.0.1:8983/solr/films/config/params -X POST -H 'Content-type:application/json' --data-binary '{
"set": {
    "algo_a":{
      "defType":"dismax",
      "qf":"name"
    }
  },
  "set": {
    "algo_b":{
      "defType":"dismax",
      "qf":"name",
      "mm":"100%"
    }
  }
}'

アルゴリズム A を使用して「harry potter」を検索します。

ハリー・ポッター映画を含む 5 つの結果が返されますが、「Dumb & Dumberer: When Harry Met Lloyd」という映画も返されていることに注意してください。

アルゴリズム B を使用して「harry potter」を検索します。

ハリー・ポッター映画 4 本のみが返され、より正確な結果が得られました!少なくともこの 1 つのクエリに関しては、アルゴリズム B の方がアルゴリズム A より優れていると考えられます。この仮説は、オンライン A/B テストで検証し、アルゴリズム B が全体として優れていることを実際のユーザーで確認できます。

練習問題 4 まとめ

この練習問題では、Schema API を使用して必要なフィールドを作成し、クエリパラメータを、Config API を使用して作成し、その後クエリで参照される、ParamSets と呼ばれる名前付きパラメータグループに整理する方法を学習しました。