MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Utwórz wielojęzyczny indeks tekstowy w MongoDB

Kiedy tworzysz text indeks w MongoDB, indeks używa domyślnego języka english .

Język domyślny określa zasady analizowania korzeni słów (tj. rdzeniowania) i ignorowania słów stop.

W razie potrzeby możesz jednak zmienić domyślny język.

Możesz również określić język na poziomie dokumentu, a nawet na poziomie poddokumentu. Język domyślny będzie używany tylko wtedy, gdy język nie został określony na poziomie dokumentu lub poddokumentu.

W tym artykule przedstawiono przykłady określania języka dla text indeks.

Przykładowa kolekcja

Załóżmy, że mamy kolekcję o nazwie sitcoms z takimi dokumentami:

{
	"_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é"
		}
	]
}

Widzimy, że w tym zbiorze znajdują się dwa dokumenty. Każdy dokument zawiera nazwę sitcomu wraz z tłumaczeniem tej nazwy na różne języki. Język każdego tłumaczenia jest określony w language pole odpowiedniego poddokumentu.

Drugi dokument w tej kolekcji zawiera również language pole na najwyższym poziomie (w tym przypadku "language" : "spanish" ). Oznacza to, że nazwa sitcomu jest po hiszpańsku (a przynajmniej hiszpański jest językiem, którego chcemy używać podczas indeksowania tego dokumentu).

Jednak pierwszy dokument nie zawiera takiego pola. Fakt, że pierwszy dokument nie zawiera language najwyższego poziomu pole oznacza, że ​​chcemy, aby było indeksowane przy użyciu domyślnego języka. Jeśli podczas indeksowania nie określono języka domyślnego, domyślnym językiem będzie angielski.

Jeśli osadzony dokument nie zawiera pola określającego język, użyje pola języka załączonego dokumentu. Jeśli załączony dokument nie zawiera pola języka, użyje języka domyślnego.

Utwórz indeks tekstowy dla wielu języków

Chodźmy dalej i utwórzmy text indeks dla powyższej kolekcji.

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

To tworzy złożony text indeks na original_name pole i translations.sitcom_name pole (np. sitcom_name w osadzonych dokumentach).

Teraz użyjmy getIndexes() aby spojrzeć na ten indeks:

db.sitcoms.getIndexes()

Wynik:

[
	{
		"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
	}
]

Widzimy, że używa domyślnego języka angielskiego. Jest to określone jako "default_language" : "english" .

Zmień domyślny język

W razie potrzeby możemy ustawić inny język domyślny podczas tworzenia indeksu.

Upuśćmy indeks i utwórzmy go ponownie w innym domyślnym języku:

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

Rzućmy okiem na indeks:

db.sitcoms.getIndexes()

Wynik:

[
	{
		"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
	}
]

Widzimy, że domyślnym językiem jest teraz danish jak określono.

language_override Parametr

Być może zastanawiasz się „Skąd MongoDB wiedział, że language dokumentu? pole jest polem, które określa język?”.

I to jest świetne pytanie. W końcu, co by było, gdybyśmy nadawali polu inną nazwę – skąd MongoDB wiedziałby, że to czy pole ma być używane dla języka?

Jeśli spojrzysz na powyższy indeks, zobaczysz, że ma on language_override pole. W szczególności wygląda to tak:"language_override" : "language"

Oznacza to, że language dokumentu pole będzie polem, którego indeks używa do zastąpienia języka.

Kiedy tworzysz text indeks, indeks będzie szukał pól o nazwie language a następnie użyj ich jako języka odpowiedniego dokumentu.

Jednak nazwa language nie jest osadzony w kamieniu. Możesz to zmienić, jeśli sobie tego życzysz.

Załóżmy, że nasza kolekcja zawiera dokumenty, w których nazwy pól są w języku duńskim.

Tak:

{
	"_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é"
		}
	]
}

W tym przypadku sprog to pole, które określa język każdego dokumentu.

Dlatego możemy utworzyć indeks w następujący sposób:

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

Sprawdźmy indeks:

db.sitcoms.getIndexes()

Wynik:

[
	{
		"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
	}
]

W naszym nowo utworzonym text indeks, mamy default_language jako danish i language_override pole jako sprog .

Dostępne języki

W chwili pisania tego tekstu istnieje około 15 języków obsługiwanych przez text indeksy i $text operatora.

Możesz użyć długiej nazwy języka (jak w powyższych przykładach) lub dwuliterowego kodu języka ISO 639-1.

Lista języków wyszukiwania tekstu jest dostępna na stronie MongoDB.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak korzystać z modelowania danych MongoDB w celu poprawy operacji związanych z przepustowością

  2. MongoDB $ne Operator potoku agregacji

  3. zapisz adres IP w mongoDB

  4. Opcje konfiguracji środowiska wykonawczego ClusterControl

  5. MongoError:nie udało się połączyć z serwerem przy pierwszym połączeniu