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

MongoDBで多言語テキストインデックスを作成する

    textを作成するとき MongoDBのインデックスでは、インデックスはenglishのデフォルト言語を使用します 。

    デフォルトの言語は、単語の語根を解析し(つまり、ステミング)、ストップワードを無視するルールを決定します。

    ただし、必要に応じてデフォルトの言語を変更できます。

    また、ドキュメントレベル、さらにはサブドキュメントレベルで言語を指定することもできます。デフォルトの言語は、ドキュメントまたはサブドキュメントレベルで言語が指定されていない場合にのみ使用されます。

    この記事では、textの言語を指定する例を紹介します。 インデックス。

    サンプルコレクション

    sitcomsというコレクションがあるとします。 このようなドキュメントで:

    {
    	"_id" : 1,
    	"original_name" : "Family Guy",
    	"translations" : {
    		"language" : "german",
    		"sitcom_name" : "Familienmensch"
    	}
    }
    {
    	"_id" : 2,
    	"original_name" : "Cuéntame como pasó",
    	"language" : "spanish",
    	"translations" : [
    		{
    			"language" : "english",
    			"sitcom_name" : "Tell me how it happened"
    		},
    		{
    			"language" : "french",
    			"sitcom_name" : "Raconte-moi comment cela s'est passé"
    		}
    	]
    }

    このコレクションには2つのドキュメントがあることがわかります。各ドキュメントには、シットコムの名前と、そのシットコム名のさまざまな言語への翻訳が含まれています。各翻訳の言語は、languageで指定されています それぞれのサブドキュメントのフィールド。

    このコレクションの2番目のドキュメントには、languageも含まれています。 トップレベルのフィールド(この場合、"language" : "spanish" )。これは、sitcomの名前がスペイン語であることを意味します(または、少なくとも、このドキュメントのインデックスを作成するときに使用する言語はスペイン語です)。

    ただし、最初のドキュメントにはそのようなフィールドは含まれていません。最初のドキュメントにトップレベルのlanguageが含まれていないという事実 フィールドは、デフォルトの言語を使用してインデックスを作成することを意味します。インデックス作成中にデフォルト言語が指定されていない場合、デフォルト言語は英語になります。

    埋め込まれたドキュメントに言語を指定するフィールドが含まれていない場合は、それを囲むドキュメントの言語フィールドが使用されます。同封のドキュメントに言語フィールドが含まれていない場合は、デフォルトの言語が使用されます。

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

    先に進んで、textを作成しましょう 上記のコレクションのインデックス。

    db.sitcoms.createIndex( 
      { 
        "original_name": "text",
        "translations.sitcom_name": "text"
      }
    )

    これにより、複合textが作成されます original_nameのインデックス フィールド、およびtranslations.sitcom_name フィールド(つまり、sitcom_name 埋め込まれたドキュメントのフィールド)。

    それでは、getIndexes()を使用しましょう そのインデックスを確認するには:

    db.sitcoms.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"_fts" : "text",
    			"_ftsx" : 1
    		},
    		"name" : "original_name_text_translations.sitcom_name_text",
    		"weights" : {
    			"original_name" : 1,
    			"translations.sitcom_name" : 1
    		},
    		"default_language" : "english",
    		"language_override" : "language",
    		"textIndexVersion" : 3
    	}
    ]

    デフォルトの英語の言語を使用していることがわかります。これは"default_language" : "english"として指定されます 。

    デフォルト言語の変更

    必要に応じて、インデックスを作成するときに別のデフォルト言語を設定できます。

    インデックスを削除して、別のデフォルト言語で再作成しましょう:

    db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
    db.sitcoms.createIndex( 
      { 
        "original_name": "text",
        "translations.sitcom_name": "text"
      },
      {
        "default_language": "danish"
      }
    )

    インデックスを見てみましょう:

    db.sitcoms.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"_fts" : "text",
    			"_ftsx" : 1
    		},
    		"name" : "original_name_text_translations.sitcom_name_text",
    		"default_language" : "danish",
    		"weights" : {
    			"original_name" : 1,
    			"translations.sitcom_name" : 1
    		},
    		"language_override" : "language",
    		"textIndexVersion" : 3
    	}
    ]

    デフォルトの言語がdanishになっていることがわかります 指定どおり。

    language_override パラメータ

    「MongoDBはドキュメントのlanguageをどのようにして知ったのか疑問に思われるかもしれません。 fieldは、言語を指定するフィールドですか?」

    そして、それは素晴らしい質問です。結局のところ、フィールドに別の名前を付けたとしたら、MongoDBはそれをどのように知るのでしょうか。 言語に使用するフィールドは何ですか?

    上記のインデックスを見ると、language_overrideがあることがわかります。 分野。具体的には、次のようになります。"language_override" : "language"

    つまり、ドキュメントのlanguage fieldは、インデックスが言語をオーバーライドするために使用するフィールドになります。

    textを作成するとき index、インデックスはlanguageと呼ばれるフィールドを探します 次に、それらをそれぞれのドキュメントの言語として使用します。

    ただし、名前はlanguage 石に設定されていません。必要に応じて変更できます。

    コレクションに、フィールド名がデンマーク語であるドキュメントが含まれているとします。

    このように:

    {
    	"_id" : 1,
    	"originalt_navn" : "Family Guy",
    	"sprog" : "english",
    	"oversættelser" : {
    		"sprog" : "german",
    		"sitcom-navn" : "Familienmensch"
    	}
    }
    {
    	"_id" : 2,
    	"originalt_navn" : "Cuéntame como pasó",
    	"sprog" : "spanish",
    	"oversættelser" : [
    		{
    			"sprog" : "english",
    			"sitcom-navn" : "Tell me how it happened"
    		},
    		{
    			"sprog" : "french",
    			"sitcom-navn" : "Raconte-moi comment cela s'est passé"
    		}
    	]
    }

    この場合、sprog 各ドキュメントの言語を決定するフィールドです。

    したがって、次のようにインデックスを作成できます。

    db.sitcoms.createIndex( 
      { 
        "original_name": "text",
        "translations.sitcom_name": "text"
      },
      {
        "default_language": "danish",
        "language_override": "sprog"
      }
    )

    インデックスを確認しましょう:

    db.sitcoms.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"_fts" : "text",
    			"_ftsx" : 1
    		},
    		"name" : "original_name_text_translations.sitcom_name_text",
    		"default_language" : "danish",
    		"language_override" : "sprog",
    		"weights" : {
    			"original_name" : 1,
    			"translations.sitcom_name" : 1
    		},
    		"textIndexVersion" : 3
    	}
    ]

    新しく作成したtext インデックスには、default_languageがあります danishとして 、およびlanguage_override sprogとしてのフィールド 。

    利用可能な言語

    執筆時点で、textでサポートされている言語は約15あります。 インデックスと$text オペレーター。

    長い形式の言語名(上記の例のように)または2文字のISO639-1言語コードを使用できます。

    テキスト検索言語のリストは、MongoDBWebサイトで入手できます。


    1. MongodbAggregationフレームワークはmap/reduceよりも高速ですか?

    2. ネストされた配列データのelemMatchを使用したMongoDBクエリ

    3. MongoDBサーバーのシームレスなスケール

    4. MongoDBでMap/Reduceを使用するにはどうすればよいですか?