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

MongoDBでテキストインデックスを作成する方法

    MongoDBで作成できるインデックスにはさまざまな種類があります。文字列または文字列の配列を含むフィールドがある場合は、textを使用できます。 そのフィールドのインデックス。

    textを作成するには インデックス、文字列リテラル"text"を使用します 作成時の値として。

    単一のフィールドにテキストインデックスを作成する

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

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

    textを作成したい場合があります bodyのインデックス フィールド、またはabstract フィールド、またはその両方。

    textを作成する方法は次のとおりです bodyのインデックス フィールド:

    db.posts.createIndex( { body : "text" } )

    出力:

    {
    	"createdCollectionAutomatically" : false,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }

    これで、getIndexes()を使用できます インデックスを表示する方法:

    db.posts.getIndexes()

    結果:

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

    2つのインデックスがあることがわかります。最初のものはデフォルトの_idです コレクションで自動的に作成されるインデックス。 2番目のインデックスは、先ほど作成したものです。

    MongoDBは、新しく作成されたインデックスに名前を自動的に割り当てました。 body_textと呼ばれます 。

    複合テキストインデックスを作成する

    コレクションに含めることができるtextは1つだけです インデックスですが、必要に応じて複合インデックスにすることもできます。

    bodyを含む複合インデックスを作成しましょう フィールドとabstract フィールド。

    前述のように、コレクションには1つのtextしか含めることができません インデックスなので、作成したばかりのインデックスを削除しましょう:

    db.posts.dropIndex("body_text")

    出力:

    { "nIndexesWas" : 2, "ok" : 1 }

    OK、textを削除しました インデックス、先に進んで別のインデックスを作成しましょう–今回は複合インデックスになります:

    db.posts.createIndex( { 
      body : "text",
      abstract : "text"
    } )

    出力:

    {
    	"createdCollectionAutomatically" : false,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }

    これは、以前は1つのインデックスがあったが、現在は2つあることを示す確認メッセージです。

    インデックスのリストをもう一度確認しましょう:

    db.posts.getIndexes()

    結果:

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

    複合textに注意してください インデックスには次の制限があります。

    • 複合text インデックスには、マルチキーや地理空間インデックスフィールドなど、他の特別なインデックスタイプを含めることはできません。
    • 複合textの場合 インデックスには、textの前にあるキーが含まれます $textを実行するためのインデックスキー 検索の場合、クエリ述語には、先行するキーの等価一致条件が含まれている必要があります。
    • 複合textを作成する場合 インデックス、すべてのtext インデックスキーは、インデックス仕様書に隣接して記載されている必要があります。

    ワイルドカードテキストインデックスを作成する

    ワイルドカード$**を使用して、ワイルドカードテキストインデックスを作成できます。 フィールドパターン。

    前のインデックスを削除して、ワイルドカードテキストインデックスを作成しましょう:

    db.posts.dropIndex("body_text_abstract_text")
    db.posts.createIndex( { "$**" : "text" } )

    MongoDBには、ワイルドカードインデックスを作成する機能もありますが、ワイルドカードテキストインデックスとワイルドカードインデックスは2つの異なるものです。

    特に、ワ​​イルドカードテキストインデックスは$textをサポートします 演算子ですが、ワイルドカードインデックスはそうではありません。

    weights パラメータ

    textを作成する場合 インデックスでは、1つ以上のフィールドに重みを指定するオプションがあります。デフォルトでは、各フィールドに1の重みが与えられますが、検索結果でフィールドに多少の重みを与えるために、これを変更できます。

    db.posts.dropIndex("$**_text")
    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倍の重要性 フィールド。

    複数言語のテキストインデックスの作成

    上記のtext インデックスには"default_language" : "english"が含まれます および"language_override" : "language" その定義で。

    これらのフィールドは、複数の言語のドキュメントを処理するのに役立ちます。上記のインデックスの値はデフォルト値です。

    ドキュメントを作成するときに、languageを使用してそのドキュメントの言語を指定できます。 フィールド(またはlanguage_overrideで定義されている他のフィールド textのフィールド 索引)。そのようなフィールドがドキュメントに存在しない場合は、default_languageで指定されたデフォルトの言語が使用されます フィールド。

    default_languageを指定できます (およびlanguage_override )インデックスを作成するとき。

    複数の言語をサポートするテキストインデックスを作成する例については、MongoDBでの多言語テキストインデックスの作成を参照してください。


    1. 一意でないフィールドでのMongoGivingの「重複キーエラー」

    2. Redis:リスト結果を解析する方法

    3. redisでのAOFおよびRDBバックアップ

    4. redisの特定のパターンに一致しないキーを取得する方法は?