2016-09-20 21 views
1

は私はそれが与えるクエリMongoDBのテキストインデックスのワイルドカード重量

db.fulltext.find({ $text: { $search: 'hello world' } }, { score: { $meta: 'textScore' } }) 

しかし...との文書を発見していたサンプルDB構造インデックス

db.fulltext.createIndex({ name: 'text', '$**': 'text' }, { weights: { name: 10, '$**': 5 } }) 

[ 
    { name: 'hello world', description: { key: 'something' } }, 
    { name: 'user', description: { key: 'hello world' } }, 
] 

を持っていると仮定します私は両方のドキュメントで15.0のスコアを取得しました...ワイルドカードオペレータにウェイトを追加することは不可能ですか?なぜ2番目の文書にnameのキーを乗算するのか?

答えて

2

ワイルドカードインデックス"$**"には、テキストインデックス内のドキュメント内のすべての文字列フィールドが含まれます。上記のシナリオでは、nameは重みが10で与えられた文字列属性であり、一般にすべての文字列フィールドの重みは5です(ワイルドカードが使用されているためnameフィールドを含む)。したがって、重みはオーバーライドされます。

テキスト検索を実行すると、すべてのStringフィールドに同じ重みが与えられます。したがって、スコアは、他の索引付けされたフィールドとの相対的な意味がない(すなわち、索引の作成中にワイルドカードが使用された)ため、両方の文書で同じです。

$ text演算子は、インデックス付きフィールドに の検索語を含む各ドキュメントにスコアを割り当てます。スコアは、特定のテキスト検索クエリに対する文書のの関連性 を表します。

異なるフィールドに異なる重みが必要な場合は、インデックスを作成する際に特にフィールド名を指定する必要があります。言い換えれば、文字列フィールドに重みを与えたり、すべての文字列フィールドにワイルドカードの重みを含めたりしないでください。明らかに、一方の重みが他方の重みよりも優先されます。

下記のようにインデックスを変更できる場合は、その違いを確認できます。

インデックスを作成します -

db.fulltext.createIndex({ name: 'text', 'description.key' : 'text' }, { weights: { name: 10, 'description.key' : 5 } }) 

検索: -

db.fulltext.find({ $text: { $search: 'hello world' } }, { score: { $meta: 'textScore' } }) 

結果: -

{ 
    "_id" : ObjectId("57e119cbf522cc85b5595797"), 
    "name" : "hello world", 
    "description" : { 
     "key" : "something" 
    }, 
    "score" : 15 
} 

{ 
    "_id" : ObjectId("57e119cbf522cc85b5595798"), 
    "name" : "user", 
    "description" : { 
     "key" : "hello world" 
    }, 
    "score" : 7.5 
} 
関連する問題