MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Crea un indice di testo con pesi di campo diversi in MongoDB

Quando crei un text index in MongoDB, hai la possibilità di applicare pesi diversi a ciascun campo indicizzato.

Questi pesi denotano il significato relativo dei campi indicizzati l'uno rispetto all'altro. Un campo con un peso maggiore avrà un impatto maggiore nei risultati di ricerca rispetto a un campo con un peso inferiore.

Ciò ti fornisce un certo controllo sul modo in cui vengono calcolati i risultati della ricerca.

Il peso predefinito è 1, quindi se non specifichi un peso per il campo, verrà assegnato un peso di 1.

Esempio

Supponiamo di avere una raccolta chiamata posts e contiene documenti come questo:

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

Potremmo creare un text composto indicizza i tre campi di testo e applica pesi diversi a ciascuno di essi.

In questo modo:

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

Quando ho creato il composto text indice, ho specificato 3 campi. Quando ho specificato i pesi, ho specificato i pesi solo per due di quei campi.

Il risultato è che questi due campi verranno ponderati come specificato e l'altro campo (title ) avrà il peso predefinito di 1.

Possiamo vederlo quando eseguiamo getIndexes() :

db.posts.getIndexes()

Risultato:

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

Ciò significa che il body il campo avrà il doppio del significato dell'abstract campo e dieci volte il significato del title campo.

Indici di testo con caratteri jolly con campi ponderati

È possibile applicare pesi durante la creazione di indici di testo con caratteri jolly. Gli indici di testo con caratteri jolly possono essere utili quando non sai quali saranno i campi di testo nei documenti. Potresti conoscerne alcuni , ma non solo.

In questi casi, puoi creare un indice di testo con caratteri jolly e assegnare un peso a quei campi di cui sei a conoscenza. A tutti gli altri campi verrà assegnato il valore predefinito di 1.

Supponiamo di avere il seguente documento come linea guida:

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

È simile al documento precedente, tranne per il fatto che ora ha un tags campo che contiene una matrice. Ma per quanto ne sappiamo, i documenti futuri in quella raccolta potrebbero avere altri campi, come forse categories , keywords , author_bio , ecc.

Ma in realtà non lo sappiamo, quindi creeremo un indice di testo con caratteri jolly che incapsula tutti i campi con dati di stringa. E creeremo ponderazioni per alcuni dei campi conosciuti.

Esempio:

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

In questo caso, il body campo ottiene un peso di 10 e l'abstract campo ottiene un peso di 5 . Ciò significa che il body campo ha il doppio dell'impatto del campo astratto e dieci volte l'impatto di tutti gli altri campi di testo (perché verrà assegnato il peso predefinito di 1).

Dopo aver creato quell'indice, se chiamiamo getIndexes() , possiamo vedere le ponderazioni assegnate ai campi:

db.posts.getIndexes()

Risultato:

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

Come previsto, il body il campo ottiene 10 , l'abstract il campo ottiene 5 e tutti gli altri ottengono 1 .