MoreLikeThis
MoreLikeThis は、結果リスト内のドキュメントに類似したドキュメントのクエリを有効にします。
これは、元のドキュメントの用語を使用して、インデックス内の類似ドキュメントを検索することによって行われます。
MoreLikeThis を使用するには、いくつかの方法があります。 最も一般的な最初の方法は、リクエストハンドラとして使用することです。 この場合、必要に応じて (ユーザーが「類似ドキュメント」リンクをクリックした場合など) MoreLikeThis リクエストハンドラにテキストを送信します。
2 番目の方法は、検索コンポーネントとして使用することです。 これは、ユーザーのクエリに一致するすべてのドキュメントに対して MoreLikeThis 分析を実行するため、あまり望ましくありません。 これにより、検索結果が遅くなる可能性があります。
別のアプローチは、リクエストハンドラとして使用しますが、外部から提供されたテキストを使用することです。 この場合、MoreLikeThisHandler とも呼ばれ、入力ドキュメントのテキストに基づいて、インデックス内の類似ドキュメントに関する情報を提供します。
最後に、MLT クエリパーサーを使用できます。 これはリクエストハンドラとほぼ同じように動作しますが、クエリパーサーであるため、フィルタークエリ、ブーストクエリなどで使用でき、必要に応じて結果をページネーションまたはハイライトできます。
MoreLikeThis の仕組み
MoreLikeThis
は、ドキュメント内の用語に基づいて Lucene クエリを構築します。 これは、リクエストで提供されたフィールドのリストから用語を取得することによって行われます。
最良の結果を得るには、フィールドに保存された用語ベクトル (termVectors=true
) が含まれている必要があります。これは、スキーマで構成できます。 用語ベクトルが保存されていない場合、MoreLikeThis は保存されたフィールドから用語を生成できます。 MoreLikeThis が正しく機能するためには、uniqueKey
に使用されるフィールドも保存する必要があります。
元のドキュメントの用語は、MoreLikeThis パラメータで定義されたしきい値を使用してフィルタリングされます。 用語が選択されると、必要に応じて他のクエリパラメータを使用してクエリが実行され、新しいドキュメントセットが返されます。
MoreLikeThis ハンドラとコンポーネント
MoreLikeThis リクエストハンドラと検索コンポーネントは、いくつかのパラメータを共有しますが、以下で説明するように、レスポンスと操作にはいくつかの重要な違いがあります。
共通のハンドラとコンポーネントのパラメータ
以下のリストは、Solr でサポートされている MoreLikeThis
パラメータをまとめたものです。 これらのパラメータは、MoreLikeThis 検索コンポーネントまたはリクエストハンドラで使用できます。
mlt.fl
-
必須
デフォルト: なし
類似性に使用するフィールドを指定します。 フィールドのリストは、コンマで区切って指定できます。 可能であれば、フィールドには保存された
termVectors
が含まれている必要があります。 mlt.mintf
-
オプション
デフォルト:
2
ソースドキュメントで無視される用語の最小頻度を指定します。
mlt.mindf
-
オプション
デフォルト:
5
少なくともこのドキュメント数に出現しない用語は、この最小頻度未満の場合無視されます。
mlt.maxdf
-
オプション
デフォルト: なし
このドキュメント数より多くに出現する用語は、この最大頻度を超える場合無視されます。
mlt.maxdfpct
-
オプション
デフォルト: なし
インデックス内のドキュメント数に対する比率を使用して、最大ドキュメント頻度を指定します。指定する値は、
0
から100
までの整数でなければなりません。たとえば、mlt.maxdfpct=75
は、単語がインデックス内のドキュメントの 75% 以上に出現する場合、その単語が無視されることを意味します。 mlt.minwl
-
オプション
デフォルト: なし
単語が無視される最小単語長を設定します。
mlt.maxwl
-
オプション
デフォルト: なし
単語が無視される最大単語長を設定します。
mlt.maxqt
-
オプション
デフォルト:
25
生成されるクエリに含まれるクエリ用語の最大数を設定します。
mlt.maxntp
-
オプション
デフォルト:
5000
TermVector サポートで保存されていない各サンプルドキュメントフィールドで解析するトークンの最大数を設定します。
mlt.boost
-
オプション
デフォルト:
false
興味深い用語の関連性によってクエリがブーストされるかどうかを指定します。指定できる値は
true
またはfalse
です。 mlt.qf
-
オプション
デフォルト: なし
DisMax クエリパーサーで使用されているのと同じ形式を使用して、クエリフィールドとそのブーストを指定します。これらのフィールドは
mlt.fl
でも指定する必要があります。 mlt.interestingTerms
-
オプション
デフォルト:
none
MoreLikeThis クエリに使用された上位の用語 (TF/IDF に基づく) を示すセクションをレスポンスに追加します。3 つの値をサポートしています。
-
list
は用語を一覧表示します。 -
none
は用語を一覧表示しません (デフォルト)。 -
details
は、各用語に使用されるブースト値とともに用語を一覧表示します。mlt.boost=true
でない限り、すべての用語のboost=1.0
になります。
このパラメータを 検索コンポーネント で使用するには、クエリを分散できません。興味深い用語を取得するには、クエリを単一のシャードに送信し、そのシャードのみに制限する必要があります (
shards
パラメータを使用)。ただし、マルチシャードのサポートは、MoreLikeThis リクエストハンドラで使用できます。 -
MoreLikeThis リクエストハンドラ
リクエストハンドラの構成
MoreLikeThis リクエストハンドラはデフォルトでは構成されておらず、使用する前に設定する必要があります。これは、solrconfig.xml
を手動で編集するか、Config API を使用して行うことができます。
手動設定
<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">
<str name="mlt.fl">body</str>
</requestHandler>
構成 API
curl -X POST -H 'Content-type:application/json' -d {
"add-requesthandler": {
"name": "/mlt",
"class": "solr.MoreLikeThisHandler",
"defaults": {"mlt.fl": "body"}
}
} https://127.0.0.1:8983/solr/<collection>/config
上記の両方の例では、リクエストハンドラの mlt.fl
パラメータを "body" に設定しています。これは、個々のリクエストで特にオーバーライドされない限り、ハンドラへのすべてのリクエストでこの値がパラメータに使用されることを意味します。
リクエストハンドラの構成全般については、デフォルトコンポーネント のセクションを参照してください。
リクエストハンドラのパラメータ
MoreLikeThis リクエストハンドラは、上記の 共通パラメータ に加えて、以下のパラメータをサポートしています。共通のクエリパラメータを使用して、ファセット、ページング、フィルタリングをサポートしますが、代替クエリパーサーとはうまく機能しません。
mlt.match.include
-
オプション
デフォルト:
true
レスポンスに一致したドキュメントを含めるかどうかを指定します。
false
に設定すると、レスポンスは通常の選択レスポンスのように見えます。 mlt.match.offset
-
オプション
デフォルト: なし
MoreLikeThis クエリを実行するドキュメントを見つけるための、メインクエリの検索結果へのオフセットを指定します。デフォルトでは、クエリは
q
パラメータの最初の結果に対して動作します。
リクエストハンドラのクエリとレスポンス
MoreLikeThis リクエストハンドラへのクエリは、構成時に定義された名前 (上記の例では /mlt
) を使用します。
次のクエリ例では、Solr のサンプルドキュメントセット (./example/exampledocs
) にあるドキュメント (q=id:0553573403
) を使用し、author フィールドを使用して類似のドキュメントを検索するように要求しています (mlt.fl=author
)。
https://127.0.0.1:8983/solr/gettingstarted/mlt?mlt.fl=author&mlt.interestingTerms=details&mlt.match.include=true&mlt.mindf=0&mlt.mintf=0&q=id%3A0553573403
このクエリは、ブースト付きの興味深い用語 (mlt.interestingTerms=details
) と元のドキュメントも返すように要求しています (mlt.match.include=true
)。最小用語頻度と最小単語ドキュメント頻度は 0
に設定されています。
レスポンスには、元のドキュメントを含む match
セクションが含まれます。response
セクションには、類似のドキュメントが含まれます。最後に、interestingTerms
セクションには、類似ドキュメントの検索に使用された author フィールドの用語が表示されます。mlt.boost
も指定しなかったため、興味深い用語に表示されるブースト値はすべて 1.0
と表示されます。
{
"match":{"numFound":1,"start":0,"numFoundExact":true,
"docs":[
{
"id":"0553573403",
"cat":["book"],
"name":["A Game of Thrones"],
"price":[7.99],
"inStock":[true],
"author":["George R.R. Martin"],
"series_t":"A Song of Ice and Fire",
"sequence_i":1,
"genre_s":"fantasy",
"_version_":1693062911089442816}]
},
"response":{"numFound":2,"start":0,"numFoundExact":true,
"docs":[
{
"id":"0553579908",
"cat":["book"],
"name":["A Clash of Kings"],
"price":[7.99],
"inStock":[true],
"author":["George R.R. Martin"],
"series_t":"A Song of Ice and Fire",
"sequence_i":2,
"genre_s":"fantasy",
"_version_":1693062911094685696},
{
"id":"055357342X",
"cat":["book"],
"name":["A Storm of Swords"],
"price":[7.99],
"inStock":[true],
"author":["George R.R. Martin"],
"series_t":"A Song of Ice and Fire",
"sequence_i":3,
"genre_s":"fantasy",
"_version_":1693062911095734272}]
},
"interestingTerms":[
"author:r.r",1.0,
"author:george",1.0,
"author:martin",1.0]}
mlt.match.include=true
を要求しなかった場合、レスポンスには match
セクションは含まれません。
MoreLikeThis への外部コンテンツのストリーミング
外部ドキュメント (インデックスにないドキュメント) を MoreLikeThis リクエストハンドラに渡して、推奨ドキュメントに使用できます。
これは、コンテンツストリーム を使用して実現されます。ドキュメントの本文は、stream.body
パラメータを使用してリクエストハンドラに直接渡すことができます。または、リモートストリームが有効になっている場合は、URL またはファイルを渡すことができます。
https://127.0.0.1:8983/solr/mlt?stream.body=electronics%20memory&mlt.fl=manu,cat&mlt.interestingTerms=list&mlt.mintf=0
このクエリは、インデックスに既に存在するドキュメントを使用する代わりに、"electronics memory" という用語をリクエストハンドラに渡します。
この場合のレスポンスは、インデックスに既に存在するドキュメントを使用した上記のレスポンスと似ています。注: SolrCloud では機能しません。考えられる解決策については、以下を確認してください。
MoreLikeThis 検索コンポーネント
MoreLikeThis を検索コンポーネントとして使用すると、別のクエリのレスポンスセット内の各ドキュメントに類似したドキュメントが返されます。これは検索パフォーマンスにコストがかかる可能性があるため、ユースケースで必要な場合にのみ使用する必要があることに注意することが重要です。
検索コンポーネントの構成
MoreLikeThis 検索コンポーネントは、すべての検索ハンドラで動作するデフォルトの検索コンポーネントです (デフォルトコンポーネント も参照)。
既に構成されているため、MoreLikeThis のデフォルトをオーバーライドする特定のコレクションのパラメータを設定する場合を除き、追加の構成は必要ありません。これを行うには、次のように構成できます。
<searchComponent name="mlt" class="solr.MoreLikeThisComponent">
<str name="mlt">true</str>
<str name="mlt.fl">body</str>
</searchComponent>
上記の例では、すべてのクエリに対して MoreLikeThis が常に有効になり、常に "body" フィールドが使用されます。これは、実際には望ましいことではないでしょう。しかし、この例は、MoreLikeThis のデフォルトとしてどのパラメータを定義できるかを示すためのものです。
上記の例のように、検索コンポーネントに "mlt" 以外の名前を付けた場合は、検索コンポーネントの参照 セクションで説明されているように、リクエストハンドラに明示的に追加する必要があります。上記の例ではデフォルトと同じ名前を使用しているため、定義されたパラメータは Solr のデフォルトをオーバーライドします。
検索コンポーネントのパラメータ
MoreLikeThis 検索コンポーネントは、上記の 共通パラメータ に加えて、以下のパラメータをサポートしています。
mlt
-
オプション
デフォルト: なし
true
に設定すると、MoreLikeThis
コンポーネントがアクティブになり、Solr はMoreLikeThis
結果を返すことができます。 mlt.count
-
オプション
デフォルト:
5
各結果に返される類似ドキュメントの数を指定します。
検索コンポーネントのクエリとレスポンス
MoreLikeThis を検索コンポーネントとして使用する場合のレスポンスは、リクエストハンドラを使用する場合とは異なります。
この場合、/select
リクエストハンドラを使用して通常のクエリ (q=author:martin
) を実行しています。MoreLikeThis をレスポンスに追加するように要求しました (mlt=true
) が、それ以外のパラメータは前の例と同じです (興味深い用語を要求し、最小用語頻度とドキュメント頻度を 0
に設定しました)。
https://127.0.0.1:8983/solr/gettingstarted/select?mlt.fl=name&mlt.mindf=0&mlt.mintf=0&mlt=true&q=author%3Amartin
レスポンスには、クエリの結果が含まれています。この場合は、author フィールドに "martin" という用語を含む 3 つのドキュメントです。ただし、フィールドを変更して、name
フィールドの値に基づいてこれらに類似したドキュメントを検索するようにしました (mlt.fl=name
)。
レスポンスには、moreLikeThis
セクションが追加されています。クエリに一致する結果の各ドキュメントについて、ドキュメント ID のリストがスコア値とともに返されます。これらの各ドキュメントは、結果リストのドキュメントと程度は異なりますが類似しています。
{
"response":{"numFound":3,"start":0,"maxScore":0.43659902,"numFoundExact":true, "docs":[
{
"id":"0553573403",
"cat":["book"],
"name":["A Game of Thrones"],
"price":[7.99],
"inStock":[true],
"author":["George R.R. Martin"],
"series_t":"A Song of Ice and Fire",
"sequence_i":1,
"genre_s":"fantasy",
"_version_":1693062911089442816},
{
"id":"0553579908",
"cat":["book"],
"name":["A Clash of Kings"],
"price":[7.99],
"inStock":[true],
"author":["George R.R. Martin"],
"series_t":"A Song of Ice and Fire",
"sequence_i":2,
"genre_s":"fantasy",
"_version_":1693062911094685696},
{
"id":"055357342X",
"cat":["book"],
"name":["A Storm of Swords"],
"price":[7.99],
"inStock":[true],
"author":["George R.R. Martin"],
"series_t":"A Song of Ice and Fire",
"sequence_i":3,
"genre_s":"fantasy",
"_version_":1693062911095734272}]
},
"moreLikeThis":[
"0553573403",{"numFound":6,"start":0,"maxScore":1.6554483,"numFoundExact":true,
"docs":[
{
"id":"055357342X",
"score":1.6554483},
{
"id":"0553579908",
"score":1.6554483},
{
"id":"0805080481",
"score":1.3422124},
{
"id":"0812550706",
"score":1.284826},
{
"id":"978-1423103349",
"score":0.7652973}]
},
"0553579908",{"numFound":5,"start":0,"maxScore":1.6554483,"numFoundExact":true,
"docs":[
{
"id":"055357342X",
"score":1.6554483},
{
"id":"0553573403",
"score":1.6554483},
{
"id":"0805080481",
"score":1.3422124},
{
"id":"978-1423103349",
"score":0.7652973},
{
"id":"VDBDB1A16",
"score":0.68205893}]
},
"055357342X",{"numFound":5,"start":0,"maxScore":1.6554483,"numFoundExact":true,
"docs":[
{
"id":"0553579908",
"score":1.6554483},
{
"id":"0553573403",
"score":1.6554483},
{
"id":"0805080481",
"score":1.3422124},
{
"id":"978-1423103349",
"score":0.7652973},
{
"id":"VDBDB1A16",
"score":0.68205893}]
}]}
MoreLikeThis クエリパーサー
mlt
クエリパーサーは、リクエストハンドラと同様に、特定のドキュメントに類似したドキュメントを取得するメカニズムを提供します。
Lucene の既存の MoreLikeThis
ロジックを使用し、SolrCloud モードでも動作します。ここで使用されるドキュメント識別子は、ドキュメントの uniqueKey
値であり、Lucene 内部ドキュメント ID ではありません。返されるドキュメントのリストには、クエリ対象のドキュメントは含まれません。
クエリパーサーの利点の 1 つは、標準の q
パラメータだけでなく、さまざまな場所で使用できることです。これにより、MoreLikeThis をブーストクエリ、フィルタークエリ、関数クエリなどに追加できます。
クエリパーサーのパラメータ
このクエリパーサーは、次のパラメータを受け取ります。
qf
-
必須
デフォルト: なし
類似性分析の基準として使用するフィールドを定義します。
mintf
-
オプション
デフォルト:
2
ソースドキュメントで無視される用語の最小頻度を定義します。
mindf
-
オプション
デフォルト:
5
少なくともこのドキュメント数に出現しない用語は、この最小頻度未満の場合無視されます。
maxdf
-
オプション
デフォルト: なし
このドキュメント数より多くに出現する用語は、この最大頻度を超える場合無視されます。
minwl
-
オプション
デフォルト: なし
単語が無視される最小単語長を設定します。
maxwl
-
オプション
デフォルト: なし
単語が無視される最大単語長を設定します。
maxqt
-
オプション
デフォルト:
25
生成されるクエリに含まれるクエリ用語の最大数を設定します。
maxntp
-
オプション
デフォルト:
5000
TermVector サポートで保存されていない各サンプルドキュメントフィールドで解析するトークンの最大数を設定します。
boost
-
オプション
デフォルト:
false
興味深い用語の関連性によってクエリがブーストされるかどうかを指定します。
true
またはfalse
を指定できます。
クエリパーサーのクエリとレスポンス
MoreLikeThis クエリパーサーリクエストの構造は、ローカルパラメータ を使用したクエリと同様です。
{!mlt qf=name}1
これは、MoreLikeThis クエリパーサーを使用して、"name" フィールドに基づいてドキュメント "1" に類似したドキュメントを検索します。
mintf
と mindf
の制限を指定する場合など、追加のパラメータをかっこ内に追加します。
{!mlt qf=name mintf=2 mindf=3}1
Solr に付属のサンプルドキュメントに基づいて、次のようなクエリが指定された場合
https://127.0.0.1:8983/solr/gettingstarted/select?q={!mlt qf=author mintf=1 mindf=1}0553573403
クエリパーサーのレスポンスには、スコアでソートされた類似ドキュメントのみが含まれます。
{
"response":{"numFound":2,"start":0,"maxScore":1.309797,"numFoundExact":true,
"docs":[
{
"id":"0553579908",
"cat":["book"],
"name":["A Clash of Kings"],
"price":[7.99],
"inStock":[true],
"author":["George R.R. Martin"],
"series_t":"A Song of Ice and Fire",
"sequence_i":2,
"genre_s":"fantasy",
"_version_":1693062911094685696},
{
"id":"055357342X",
"cat":["book"],
"name":["A Storm of Swords"],
"price":[7.99],
"inStock":[true],
"author":["George R.R. Martin"],
"series_t":"A Song of Ice and Fire",
"sequence_i":3,
"genre_s":"fantasy",
"_version_":1693062911095734272}]
}}
外部コンテンツのクエリパーサー
SolrCloudモードでは、/mlt
ハンドラーやコンテンツストリームのように、インデックスに存在しない外部コンテンツに類似したドキュメントを見つけるために、{!mlt_content}lorem ipsum
または {!mlt_content q='lorem ipsum'}
を使用します。パラメータとレスポンスは上記と同じです。これは、qf
パラメータで渡されたフィールドを、指定されたコンテンツでクエリします。 qf
が省略された場合、スキーマ内のすべてのフィールドをクエリしますが、通常、数値やその他の特定の形式のフィールドタイプでは失敗します。異なるコンテンツで異なるフィールドをクエリする必要がある場合は、複数の {!mlt_content qf=fieldA}lorem ipsum
を {!bool}
クエリなどで組み合わせます。