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

Създайте текстов индекс с различни тегла на полета в MongoDB

Когато създавате text index в MongoDB, имате възможност да приложите различни тегла към всяко индексирано поле.

Тези тегла означават относителната значимост на индексираните полета едно спрямо друго. Поле с по-високо тегло ще има по-голямо влияние в резултатите от търсенето, отколкото поле с по-ниско тегло.

Това ви осигурява известен контрол върху това как се изчисляват резултатите от търсенето.

Теглото по подразбиране е 1, така че ако не посочите тежест за поле, ще му бъде присвоена тежест 1.

Пример

Да предположим, че имаме колекция, наречена posts , и съдържа документи като този:

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

Можем да създадем съставен 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 поле.

Текстови индекси с заместващи знаци с претеглени полета

Можете да прилагате тежести, когато създавате индекси на текст с заместващи знаци. Текстовите индекси със заместващи знаци могат да бъдат полезни, когато не знаете какви ще бъдат текстовите полета в документите. Може би познавате някои , но не всички.

В такива случаи можете да създадете текстов индекс с заместващи знаци и да присвоите тежест на онези полета, които сте наясно. На всички други полета ще бъде присвоена стойност по подразбиране 1.

Да предположим, че имаме следния документ като насока:

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

Той е подобен на предишния документ, с изключение на това, че вече има tags поле, което съдържа масив. Но доколкото знаем, бъдещите документи в тази колекция може да имат други полета – като може би categories , keywords , author_bio и др.

Но всъщност не знаем, така че ще създадем текстов индекс, който ще капсулира всички полета с низови данни. И ще създадем тежести за някои от познатите полета.

Пример:

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

В този случай body полето получава тежест от 10 и abstract полето получава тежест от 5 . Това означава, че body поле има двойно по-голямо въздействие от абстрактното поле и десет пъти по-голямо от всички други текстови полета (защото ще им бъде присвоена тежест по подразбиране от 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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Дефиниране на схема Mongoose в движение от JSON-форматирано „описание“

  2. Заявка за Mongo, използваща mongoid в приложението Rails, което причинява грешка при изчакване на курсора

  3. MongoError:Опцията 'cursor' е задължителна, с изключение на агрегирането с аргумента за обяснение

  4. Получаване на _id на вмъкнат документ в MongoDB?

  5. Как да използвате mongoose Promise - mongo