Docs Menu
Docs Home
/
MongoDB Atlas
/ / / /

moreLikeThis

項目一覧

  • 定義
  • 動作
  • 使用法
  • 構文
  • オプション
  • 制限
moreLikeThis

moreLikeThis演算子は、入力ドキュメントと同様のドキュメントを返します。 moreLikeThis演算子を使用すると、指定された 1 つ以上のドキュメントに基づいて類似または代替の結果を表示するアプリケーションの機能を構築できます。

moreLikeThisクエリを実行すると、Atlas Search は次のアクションを実行します。

  • 演算子のlikeオプションで指定した入力ドキュメントに基づいて、限られた数の最も一般的なタームを抽出します。

  • 最も一般的なタームに基づいて類似したドキュメントを検索するための論理和( OR )クエリを作成し、その結果を返します。

moreLikeThis演算子は、 インデックス構成 で指定した アナライザ を使用して類似ドキュメントを検索します。インデックス定義で アナライザを省略すると、 moreLikeThis演算子はデフォルトの標準 アナライザを使用します。 複数のアナライザを指定すると、 moreLikeThis演算子は各アナライザを通じて入力テキストを実行し、すべてのアナライザの結果を検索して返します。

類似ドキュメントを検索するために Atlas Search が構築する論理和( OR )を表示するには、 moreLikeThis演算子クエリでexplainを使用します。

moreLikeThis演算子クエリを実行する前に、1 つ以上の入力ドキュメントを取得することをお勧めします。 入力ドキュメントを取得するには、次のいずれかを実行します。

  • find()などのクエリまたは別の MQL クエリを実行して、 BSONドキュメントを検索します。

  • BSONドキュメントを返す集計パイプラインを実行します。

  • アプリケーション内の他のドキュメント ソースを使用します。

入力ドキュメントを識別したら、それをmoreLikeThis演算子に渡すことができます。

moreLikeThis演算子クエリを実行すると、Atlas Search はクエリ結果に元の入力ドキュメントを返します。 クエリ結果から入力ドキュメントを除外するには、複合演算子クエリでmoreLikeThis演算子を使用し、 mustNot句でequals演算子を使用して入力ドキュメントを_idで除外します。

moreLikeThis の構文は次のとおりです。

{
"$search": {
"index": index name, // optional, defaults to "default"
"moreLikeThis": {
"like": [
{
<"field-name">: <"field-value">,
...
},
...
],
"score": <options>
}
}
}

moreLikeThis は、次のオプションを使用してクエリを構築します。

フィールド
タイプ
説明
必要性
like
1 つのBSONドキュメントまたはドキュメントの配列
Atlas Search がクエリ対象の表現タームを抽出するために使用する 1 つ以上のBSONドキュメント。
必須
score
オブジェクト

一致する検索結果に割り当てる スコア 。 デフォルトのスコアは、次のオプションを使用して変更できます。

  • boost: 結果のスコアに指定された数値を掛けます。

  • constant: 結果のスコアを指定された数値に置き換えます。

  • function: 結果のスコアを指定された式で置き換えます。

クエリで score を使用する方法については、「結果内のドキュメントのスコアリング」を参照してください。

配列内の値をクエリする場合、Atlas Search は、クエリに一致した配列内の値の数に基づいて、一致結果のスコアを変更しません。配列内の一致の数に関係なく、スコアは単一の一致と同じになります。

任意

moreLikeThis演算子を使用して文字列以外の値をクエリすることはできません。 文字列以外の値を検索するには、moreLikeThis 複合演算子 クエリの に近い 範囲 、またはその他の演算子と クエリを組み合わせます。

embeddedDocument演算子内でmoreLikeThis演算子を使用して、配列内のドキュメントをクエリすることはできません。

例では、 sample_mflixデータベース内のmoviesコレクションを使用します。 このセクションの各例では、異なるインデックス定義を使用して、 演算子の異なる機能を示します。

クラスターでサンプル クエリを実行する前に、Atlas クラスターにサンプル データ をロードし、推奨されるインデックスを作成してください。 UI、 API、または CLI を使用して Atlas Search インデックスを作成する方法について詳しくは、「 Atlas Search インデックスの作成」を参照してください。 インデックス定義では、 defaultという名前が使用されます。

インデックスにdefaultと名付けると、 $searchパイプライン ステージでindexパラメータを指定する必要がなくなります。 インデックスにカスタム名を付ける場合は、 indexパラメータでこの名前を指定する必要があります。

次の例では、 moreLikeThis演算子を使用して、複数のフィールド値に類似するドキュメントを検索します。 この例では、インデックス定義には、コレクション内のすべての 動的にインデックス付け可能なフィールドタイプ を動的にインデックス化するための 動的 マッピング が含まれています。sample_mflix.moviesコレクションのインデックス定義は次のようになります。

{
"mappings": {
"dynamic": true
}
}

次のクエリは、入力映画タイトル「The GofFAther」と入力映画のジャンル「アクション」に似た映画を検索します。 出力を5の結果に制限する$limitステージと、 titlereleasedgenresを除くすべてのフィールドを除外する$projectステージが含まれています。

1db.movies.aggregate([
2 {
3 "$search": {
4 moreLikeThis: {
5 like:
6 {
7 "title": "The Godfather",
8 "genres": "action"
9 }
10 }
11 }
12 },
13 { "$limit": 5},
14 {
15 $project: {
16 "_id": 0,
17 "title": 1,
18 "released": 1,
19 "genres": 1
20 }
21 }
22])
[
{ genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'Godfather' },
{
genres: [ 'Crime', 'Drama' ],
title: 'The Godfather',
released: ISODate("1972-03-24T00:00:00.000Z")
},
{
genres: [ 'Crime', 'Drama' ],
title: 'The Godfather: Part II',
released: ISODate("1974-12-20T00:00:00.000Z")
},
{
genres: [ 'Crime', 'Drama' ],
title: 'The Godfather: Part III',
released: ISODate("1990-12-26T00:00:00.000Z")
},
{
genres: [ 'Action' ],
title: 'The Defender',
released: ISODate("1994-07-28T00:00:00.000Z")
}
]

Atlas Search 結果には、入力映画タイトル「The GofFAther」と入力映画ジャンル「アクション」に類似する映画が含まれています。

次の例では、 find()を使用して入力ドキュメントを識別し、 moreLikeThis演算子を使用して類似ドキュメントを検索します。 この例では、インデックス定義では静的マッピングを使用して、 titlegenres 、および_idフィールドのみがインデックス化されています。

1{
2 "mappings": {
3 "dynamic": false,
4 "fields": {
5 "title": {
6 "type": "string"
7 },
8 "genres": {
9 "type": "string"
10 },
11 "_id": {
12 "type": "objectId"
13 }
14 }
15 }
16}

次のfind()クエリは、「The GofFAther」というタイトルの映画を検索し、その結果をmovie内に保存します。 結果には一致するドキュメントの フィールドとtitle genresフィールドのみを含めることを指定します。デフォルトでは、 find ()コマンドは常に_idフィールドを返します。このフィールドの値はクラスターによって異なる場合があることに注意してください。

movie = db.movies.find( { title: "The Godfather" }, { genres: 1, title: 1} ).toArray()
[
{
_id: ObjectId("573a1396f29313caabce4a9a"),
genres: [ 'Crime', 'Drama' ],
title: 'The Godfather'
}
]

moreLikeThis次のクエリでは、 演算子を持つ 複合title 演算子を使用してgenres フィールドと フィールドをクエリし、 equals 演算子を使用して入力ドキュメントを除外します。

  • movieに保存されている映画に似た映画をクエリするmust句。

  • 入力ドキュメントを除外するmustNot句は、 _id値の結果から除外します。 クエリで使用される_id値は、前のfind()クエリの結果の_id値と一致していることに注意してください。

クエリは出力を5の結果に制限します。 クエリは$projectステージを使用して、 _idtitlereleasedgenresフィールドを結果に含めます。

注意

このクエリを実行する前に、13 行目の_idフィールドの値を、クエリ結果内の_idフィールドの値に置き換えます。

1db.movies.aggregate([
2 {
3 "$search": {
4 "compound":{
5 "must":[{
6 "moreLikeThis": {
7 "like": movie
8 }
9 }],
10 "mustNot":[{
11 "equals": {
12 "path": "_id",
13 "value": ObjectId ("573a1396f29313caabce4a9a")
14 }
15 }]
16 }
17 }
18 },
19{"$limit": 5},
20{
21 "$project": {
22 "_id": 1,
23 "title": 1,
24 "released": 1,
25 "genres": 1
26 }
27 }
28])
[
{
_id: ObjectId("573a13acf29313caabd27afc"),
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: 'Godfather'
},
{
_id: ObjectId("573a1396f29313caabce557f"),
genres: [ 'Crime', 'Drama' ],
title: 'The Godfather: Part II',
released: ISODate("1974-12-20T00:00:00.000Z")
},
{
_id: ObjectId("573a1398f29313caabcebf7b"),
genres: [ 'Crime', 'Drama' ],
title: 'The Godfather: Part III',
released: ISODate("1990-12-26T00:00:00.000Z")
},
{
_id: ObjectId("573a1399f29313caabceed8d"),
genres: [ 'Action' ],
title: 'The Defender',
released: ISODate("1994-07-28T00:00:00.000Z")
},
{
_id: ObjectId("573a139af29313caabcef2a0"),
genres: [ 'Action' ],
title: 'The Enforcer',
released: ISODate("1995-03-02T00:00:00.000Z")
}
]

Atlas Search 結果には、 actionジャンルのクエリ用語The Godfatherに類似するドキュメントが含まれます。 ただし、結果には_idによって除外されたドキュメントは含まれません。このドキュメントはObjectId("573a1396f29313caabce4a9a")です。

次の例では、 find()を使用して入力ドキュメントを識別し、 moreLikeThis演算子を使用して類似ドキュメントを検索します。 この例では、インデックス定義は静的マッピングを使用して、さまざまなアナライザでsample_mflix.moviesコレクション内のフィールドをインデックス化します。 インデックスの定義:

  • _idtitlegenresフィールドにインデックスを構成します。

  • lucene.standardアナライザと、 lucene.keywordアナライザを使用するkeywordAnalyzerという名前の代替アナライザを使用してtitleフィールドを分析します。

  • lucene.englishアナライザを使用してフィールドを分析および検索します。

1{
2 "mappings": {
3 "dynamic": false,
4 "fields": {
5 "title": {
6 "type": "string",
7 "analyzer": "lucene.standard",
8 "multi": {
9 "keywordAnalyzer": {
10 "type": "string",
11 "analyzer": "lucene.keyword"
12 }
13 }
14 },
15 "genres": {
16 "type": "string"
17 },
18 "_id": {
19 "type": "objectId"
20 }
21 }
22 },
23 "analyzer": "lucene.english"
24}

次のfind()クエリは、「Alice in Universal」というタイトルの映画を検索し、その結果をmovieに保存します。 結果には一致するドキュメントの フィールドとtitle genresフィールドのみを含めることを指定します。デフォルトでは、 find()コマンドは常に_idフィールドを返します。このフィールドの値はクラスターによって異なる場合があることに注意してください。

movie = db.movies.find( { title: "Alice in Wonderland" }, { genres: 1, title: 1} ).toArray
[
{
_id: ObjectId("573a1394f29313caabcde9ef"),
plot: 'Alice stumbles into the world of Wonderland. Will she get home? Not if the Queen of Hearts has her way.',
title: 'Alice in Wonderland'
},
{
_id: ObjectId("573a1398f29313caabce963d"),
plot: 'Alice is in Looking Glass land, where she meets many Looking Glass creatures and attempts to avoid the Jabberwocky, a monster that appears due to her being afraid.',
title: 'Alice in Wonderland'
},
{
_id: ObjectId("573a1398f29313caabce9644"),
plot: 'Alice is in Looking Glass land, where she meets many Looking Glass creatures and attempts to avoid the Jabberwocky, a monster that appears due to her being afraid.',
title: 'Alice in Wonderland'
},
{
_id: ObjectId("573a139df29313caabcfb504"),
plot: `The wizards behind The Odyssey (1997) and Merlin (1998) combine Lewis Carroll's "Alice in Wonderland" and "Through the Looking Glass" into a two-hour special that just gets curiouser and curiouser.`,
title: 'Alice in Wonderland'
},
{
_id: ObjectId("573a13bdf29313caabd5933b"),
plot: "Nineteen-year-old Alice returns to the magical world from her childhood adventure, where she reunites with her old friends and learns of her true destiny: to end the Red Queen's reign of terror.",
title: 'Alice in Wonderland'
}
]

次の例では、 複合 演算子を使用して、次の句を使用してtitle genresフィールドと フィールドをクエリします。

  • should句はmoreLikeThis演算子を使用して、 movieのドキュメントに類似するドキュメントを検索します。 titleフィールドは アナライザとlucene.standard lucene.keywordアナライザの両方で分析されていることに注意してください。

  • mustNot句は、 _id値で指定された入力ドキュメントの 1 つを結果に含めることはできないことを指定します。

クエリは結果リストを10ドキュメントに制限します。 クエリは$projectステージを使用して、 _idtitlegenresフィールドを結果に含めます。

1db.movies.aggregate([
2{
3 $search: {
4 "compound": {
5 "should": [{
6 "moreLikeThis": {
7 "like": movie
8 }
9 }],
10 "mustNot": [
11 {
12 "equals": {
13 "path": "_id",
14 "value": ObjectId ("573a1394f29313caabcde9ef")
15 }
16 }]
17 }
18 }
19 },
20 { $limit: 10 },
21 {
22 $project: {
23 "title": 1,
24 "genres": 1,
25 "_id": 1
26 }
27 }
28 ])
[
{
_id: ObjectId("573a1398f29313caabce963d"),
genres: [ 'Adventure', 'Family', 'Fantasy' ],
title: 'Alice in Wonderland'
},
{
_id: ObjectId("573a1398f29313caabce9644"),
genres: [ 'Adventure', 'Family', 'Fantasy' ],
title: 'Alice in Wonderland'
},
{
_id: ObjectId("573a139df29313caabcfb504"),
genres: [ 'Adventure', 'Comedy', 'Family' ],
title: 'Alice in Wonderland'
},
{
_id: ObjectId("573a13bdf29313caabd5933b"),
genres: [ 'Adventure', 'Family', 'Fantasy' ],
title: 'Alice in Wonderland'
},
{
_id: ObjectId("573a1396f29313caabce3e7e"),
genres: [ 'Comedy', 'Drama' ],
title: 'Alex in Wonderland'
},
{
_id: ObjectId("573a13bdf29313caabd5a44b"),
genres: [ 'Drama' ],
title: 'Phoebe in Wonderland'
},
{
_id: ObjectId("573a139af29313caabcf0e23"),
genres: [ 'Documentary' ],
title: 'Wonderland'
},
{
_id: ObjectId("573a139ef29313caabcfcebc"),
genres: [ 'Drama' ],
title: 'Wonderland'
},
{
_id: ObjectId("573a13a0f29313caabd03dab"),
genres: [ 'Drama' ],
title: 'Wonderland'
},
{
_id: ObjectId("573a13abf29313caabd2372a"),
genres: [ 'Crime', 'Drama', 'Mystery' ],
title: 'Wonderland'
}
]

次のクエリでは、 explainを前述のクエリで使用して、Atlas Search が類似ドキュメントを検索するために構築する論理和( OR )を示します。

db.movies.explain("queryPlanner").aggregate([
{
$search: {
"compound": {
"should": [{
"moreLikeThis": {
"like": [{
"title": "Alice in Wonderland"
}]
}
}],
"mustNot": [
{
"equals": {
"path": "_id",
"value": ObjectId ("573a1394f29313caabcde9ef")
}
}]
}
}
},
{ $limit: 10 },
{
$project: {
"title": 1,
"genres": 1,
"_id": 1
}
}
])
{
explainVersion: '1',
stages: [
{
'$_internalSearchMongotRemote': {
mongotQuery: {
compound: {
should: [
{
moreLikeThis: { like: [ { title: 'Alice in Wonderland' } ] }
}
],
mustNot: [
{
equals: {
path: '_id',
value: ObjectId("573a1394f29313caabcde9ef")
}
}
]
}
},
explain: {
type: 'BooleanQuery',
args: {
must: [],
mustNot: [
{
path: 'compound.mustNot',
type: 'ConstantScoreQuery',
args: {
query: {
type: 'TermQuery',
args: {
path: '_id',
value: '[57 3a 13 94 f2 93 13 ca ab cd e9 ef]'
}
}
}
}
],
should: [
{
path: 'compound.should',
type: 'BooleanQuery',
args: {
must: [],
mustNot: [],
should: [
{
type: 'TermQuery',
args: { path: 'title', value: 'in' }
},
{
type: 'TermQuery',
args: {
path: 'title.keywordAnalyzer',
value: 'Alice in Wonderland'
}
},
{
type: 'TermQuery',
args: { path: 'title', value: 'wonderland' }
},
{
type: 'TermQuery',
args: { path: 'title', value: 'alice' }
}
],
filter: [],
minimumShouldMatch: 0
}
}
],
filter: [],
minimumShouldMatch: 0
}
}
}
},
{ '$_internalSearchIdLookup': {} },
{ '$limit': Long("10") },
{ '$project': { _id: true, title: true, genres: true } }
],
serverInfo: {
...
},
serverParameters: {
...
},
command: {
aggregate: 'movies',
pipeline: [
{
'$search': {
compound: {
should: [
{
moreLikeThis: { like: [ { title: 'Alice in Wonderland' } ] }
}
],
mustNot: [
{
equals: {
path: '_id',
value: ObjectId("573a1394f29313caabcde9ef")
}
}
]
}
}
},
{ '$limit': 10 },
{ '$project': { title: 1, genres: 1, _id: 1 } }
],
cursor: {},
'$db': 'sample_mflix'
},
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1659133479, i: 1 }),
signature: {
hash: Binary(Buffer.from("865d9ef1187ae1a74c4a0da1e29882aebcf2be7c", "hex"), 0),
keyId: Long("7123262728533180420")
}
},
operationTime: Timestamp({ t: 1659133479, i: 1 })
}

戻る

knnBeta(非推奨)