sql >> Databáze >  >> NoSQL >> MongoDB

Vytvořte textový index s různými tloušťkami polí v MongoDB

Když vytvoříte text index v MongoDB, máte možnost použít různé váhy na každé indexované pole.

Tyto váhy označují vzájemnou relativní významnost indexovaných polí. Pole s vyšší váhou bude mít větší dopad na výsledky vyhledávání než pole s nižší váhou.

To vám poskytuje určitou míru kontroly nad tím, jak se vypočítávají výsledky vyhledávání.

Výchozí váha je 1, takže pokud pro pole neurčíte váhu, bude mu přiřazena váha 1.

Příklad

Předpokládejme, že máme kolekci nazvanou posts a obsahuje dokumenty jako tento:

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

Mohli bychom vytvořit složený text index na tři textová pole a aplikujte na každé z nich jinou váhu.

Takhle:

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

Když jsem vytvořil složený text index, zadal jsem 3 pole. Když jsem specifikoval váhy, určil jsem váhy jen pro dvě z těchto polí.

Výsledkem je, že tato dvě pole budou mít váhu, jak je uvedeno, a druhé pole (title ) bude mít výchozí váhu 1.

Můžeme to vidět, když spustíme getIndexes() :

db.posts.getIndexes()

Výsledek:

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

To znamená, že body pole bude mít dvakrát větší význam než abstract pole a desetkrát větší význam než title pole.

Zástupné textové indexy s váženými poli

Při vytváření indexů zástupných textů můžete použít váhy. Zástupné textové indexy mohou být užitečné, když nevíte, jaká textová pole budou v dokumentech. Možná některé znáte , ale ne všechny.

V takových případech můžete vytvořit index zástupných znaků a přiřadit váhu těm polím, o kterých víte. Všem ostatním polím bude přiřazena výchozí hodnota 1.

Předpokládejme, že máme jako vodítko následující dokument:

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

Je podobný předchozímu dokumentu, až na to, že nyní obsahuje tags pole, které obsahuje pole. Ale pokud víme, budoucí dokumenty v této sbírce mohou mít další pole – třeba categories , keywords , author_bio , atd.

Ale ve skutečnosti to nevíme, takže vytvoříme index zástupných znaků, který zapouzdří všechna pole řetězcovými daty. A vytvoříme váhy pro některá známá pole.

Příklad:

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

V tomto případě body pole získá váhu 10 a abstract pole získá váhu 5 . To znamená, že body pole má dvakrát větší dopad než abstraktní pole a desetkrát větší dopad než všechna ostatní textová pole (protože jim bude přiřazena výchozí váha 1).

Po vytvoření tohoto indexu, pokud zavoláme getIndexes() , můžeme vidět váhy dané polím:

db.posts.getIndexes()

Výsledek:

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

Jak se očekávalo, body pole získá 10 , abstract pole získá 5 a všichni ostatní dostanou 1 .


  1. jak použít naplnit a agregovat ve stejném prohlášení?

  2. Použití operátoru $slice k získání posledního prvku pole

  3. Aktualizujte kolekci MongoDB pomocí $toLower

  4. Jak zkontroluji, zda redis běží, než spustím baňku (a spustím ji, pokud ne)?