sql >> データベース >  >> NoSQL >> MongoDB

MongoDBで異なるフィールドの重みを持つテキストインデックスを作成する

    textを作成するとき MongoDBのインデックスでは、インデックス付けされた各フィールドに異なる重みを適用するオプションがあります。

    これらの重みは、インデックス付きフィールドの相互の相対的な重要性を示します。重みが大きいフィールドは、重みが小さいフィールドよりも検索結果に大きな影響を与えます。

    これにより、検索結果の計算方法をある程度制御できます。

    デフォルトの重みは1であるため、フィールドに重みを指定しない場合、重み1が割り当てられます。

    postsというコレクションがあるとします。 、次のようなドキュメントが含まれています:

    {
    	"_id" : 1,
    	"title" : "The Web",
    	"body" : "Body text...",
    	"abstract" : "Abstract text..."
    }

    複合textを作成できます 3つのテキストフィールドにインデックスを付け、それぞれに異なる重みを適用します。

    このように:

    db.posts.createIndex( 
      { 
        title : "text",
        body : "text",
        abstract : "text"
      },
      {
        weights: {
          body: 10,
          abstract: 5
        } 
      } 
    )

    複合textを作成したとき インデックス、3つのフィールドを指定しました。重みを指定したとき、それらのフィールドのうち2つだけに重みを指定しました。

    その結果、これら2つのフィールドは指定どおりに重み付けされ、もう1つのフィールド(title)が重み付けされます。 )デフォルトの重みは1になります。

    getIndexes()を実行するとこれを確認できます :

    db.posts.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"_fts" : "text",
    			"_ftsx" : 1
    		},
    		"name" : "title_text_body_text_abstract_text",
    		"weights" : {
    			"abstract" : 5,
    			"body" : 10,
    			"title" : 1
    		},
    		"default_language" : "english",
    		"language_override" : "language",
    		"textIndexVersion" : 3
    	}
    ]

    これは、body フィールドには、abstractの2倍の意味があります フィールド、およびtitleの10倍の重要性 フィールド。

    加重フィールドを使用したワイルドカードテキストインデックス

    ワイルドカードテキストインデックスを作成するときに重みを適用できます。ワイルドカードテキストインデックスは、ドキュメント内のテキストフィールドが何になるかわからない場合に便利です。あなたはいくつかを知っているかもしれません 、すべてではありません。

    このような場合、ワイルドカードテキストインデックスを作成し、認識しているフィールドに重みを割り当てることができます。その他のフィールドには、デフォルト値の1が割り当てられます。

    ガイドラインとして次のドキュメントがあるとします。

    {
    	"_id" : 1,
    	"title" : "Title text...",
    	"body" : "Body text...",
    	"abstract" : "Abstract text...",
    	"tags" : [
    		"tag1",
    		"tag2",
    		"tag3"
    	]
    }

    以前のドキュメントと似ていますが、tagsが追加されている点が異なります。 配列を含むフィールド。しかし、私たちが知っている限りでは、そのコレクションの将来のドキュメントには、categoriesなどの他のフィールドが含まれる可能性があります。 、keywordsauthor_bio 、など。

    ただし、実際にはわからないため、すべてのフィールドを文字列データでカプセル化するワイルドカードテキストインデックスを作成します。また、既知のフィールドのいくつかに重みを作成します。

    例:

    db.posts.createIndex( 
      { "$**": "text" },
      { weights: {
          body: 10,
          abstract: 5
        } 
      } 
    )

    この場合、body フィールドの重みは10になります およびabstract フィールドは5の重みを取得します 。これは、body フィールドには、抽象フィールドの2倍の影響があり、他のすべてのテキストフィールドの10倍の影響があります(デフォルトの重み1が割り当てられるため)。

    そのインデックスを作成した後、getIndexes()を呼び出すと 、フィールドに与えられた重みを確認できます:

    db.posts.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"_fts" : "text",
    			"_ftsx" : 1
    		},
    		"name" : "$**_text",
    		"weights" : {
    			"$**" : 1,
    			"abstract" : 5,
    			"body" : 10
    		},
    		"default_language" : "english",
    		"language_override" : "language",
    		"textIndexVersion" : 3
    	}
    ]

    予想通り、body フィールドは10を取得します 、abstract フィールドは5を取得します 、および他のすべては1を取得します 。


    1. Stackexchange.Redisのファイア・アンド・フォーゲットは配信を保証しますか?

    2. Redisですべてのキーを取得する方法

    3. HBaseサンプルテーブル

    4. MongoDB $slice