MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да създадете текстов индекс в MongoDB

Има различни типове индекси, които можете да създадете в MongoDB. Ако имате поле, което съдържа низ или масив от низове, можете да използвате text индекс на това поле.

За да създадете text index, използвайте низовия литерал "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
	}
]

Виждаме, че има два индекса. Първият е _id по подразбиране индекс, който се създава автоматично с колекцията. Вторият индекс е този, който току-що създадохме.

MongoDB автоматично присвои име на новосъздадения ни индекс. Нарича се body_text .

Създайте индекс на съставен текст

Една колекция може да има само един text индекс, но може да бъде съставен индекс, ако е необходимо.

Нека създадем съставен индекс, който включва body полето и abstract поле.

Както споменахме, една колекция може да има само един text индекс, така че нека пуснем индекса, който току-що създадохме:

db.posts.dropIndex("body_text")

Изход:

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

Добре, сега махнахме 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 ни предоставя и възможността да създаваме индекси с заместващи символи, но индексите на заместващи символи и индексите на заместващи символи са две различни неща.

По-специално, индексите за заместващи символи поддържат $text оператор, докато индексите с заместващи знаци не го правят.

weights Параметър

При създаване на text индекси, имате възможност да зададете тежест за едно или повече полета. По подразбиране всяко поле получава тежест от 1. Но можете да промените това, за да дадете на полетата повече или по-малко тежест в резултатите от търсенето.

Пример

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

Започнах, като пуснах предишния индекс.

Когато създадох новия text индекс, посочих 3 полета. Когато посочих теглата, посочих тегла само за две от тези полета.

Резултатът е, че тези две полета ще бъдат претеглени, както е посочено, а другото поле (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 поле и десет пъти по-голямо от значението на title поле.

Създаване на многоезични текстови индекси

Ще забележите, че горният text индексът включва "default_language" : "english" и "language_override" : "language" в нейното определение.

Тези полета помагат при работа с документи на множество езици. Стойностите в горния индекс са стойностите по подразбиране.

Когато създавате документ, можете да посочите езика на този документ, като използвате language поле (или някакво друго поле, дефинирано в language_override полето на text индекс). Ако такова поле не съществува в документа, то ще използва езика по подразбиране, посочен в default_language поле.

Можете да посочите default_languagelanguage_override ), когато създавате индекса.

Вижте Създаване на многоезичен текстов индекс в MongoDB за примери за създаване на текстови индекси, които поддържат множество езици.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Вмъкването на Mongodb/mongoose не е функция

  2. NoSQL поточно предаване на данни с MongoDB и Kafka

  3. MongoDB - Изтриване на документ

  4. получаване на атрибути на схемата от Mongoose Model

  5. Изберете данни, където диапазонът между две различни полета съдържа дадено число