MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So führen Sie eine Volltextsuche in MongoDB durch

MongoDB, eine der führenden NoSQL-Datenbanken, ist bekannt für seine schnelle Leistung, sein vielseitiges Schema, seine Skalierbarkeit und seine großartigen Indizierungsfunktionen. Lassen Sie uns einen Blick auf den Kontext werfen, bevor wir ins Detail gehen. Die Volltextsuche ist ein wesentliches Feature, wenn es um die Suche nach Inhalten im Internet geht. Eine Google-Suche ist das beste Beispiel dafür, wenn wir den Inhalt anhand der Phrasen oder Schlüsselwörter sehen. In diesem Artikel erfahren wir mehr über Volltextsuchfunktionen in MongoDB basierend auf einem Textindex.

Erstellen Sie eine Beispieldatenbank

Bevor wir beginnen, erstellen wir eine Beispieldatenbank, die während des Tutorials verwendet wird.

Wir erstellen eine Datenbank mit dem Namen myDB und erstellen Sie eine Sammlung mit dem Namen Bücher . Dafür wäre die Anweisung wie folgt.

> use myDB
> db.createCollection("books")
>

Lassen Sie uns einige Dokumente einfügen, indem Sie die folgende Anweisung verwenden.

> db.books.insert([
	{
      "title": "Eloquent JavaScript, Second Edition",
      "subtitle": "A Modern Introduction to Programming",
      "author": "Marijn Haverbeke",
      "publisher": "No Starch Press",
      "description": "JavaScript lies at the heart of almost every modern web application, from social apps to the newest browser-based games. Though simple for beginners to pick up and play with, JavaScript is a flexible, complex language that you can use to build full-scale applications."
    },
    {
      "title": "Learning JavaScript Design Patterns",
      "subtitle": "A JavaScript and jQuery Developer's Guide",
      "author": "Addy Osmani",
      "publisher": "O'Reilly Media",
      "description": "With Learning JavaScript Design Patterns, you'll learn how to write beautiful, structured, and maintainable JavaScript by applying classical and modern design patterns to the language. If you want to keep your code efficient, more manageable, and up-to-date with the latest best practices, this book is for you."
    },
    {
      "title": "Speaking JavaScript",
      "subtitle": "An In-Depth Guide for Programmers",
      "author": "Axel Rauschmayer",
      "publisher": "O'Reilly Media",
      "description": "Like it or not, JavaScript is everywhere these days, from browser to server to mobile and now you, too, need to learn the language or dive deeper than you have. This concise book guides you into and through JavaScript, written by a veteran programmer who once found himself in the same position."
    },
    {
      "title": "Programming JavaScript Applications",
      "subtitle": "Robust Web Architecture with Node, HTML5, and Modern JS Libraries",
      "author": "Eric Elliott",
      "publisher": "O'Reilly Media",
      "description": "Take advantage of JavaScript's power to build robust web-scale or enterprise applications that are easy to extend and maintain. By applying the design patterns outlined in this practical book, experienced JavaScript developers will learn how to write flexible and resilient code that's easier-yes, easier-to work with as your codebase grows."
    },
    {
      "title": "Understanding ECMAScript 6",
      "subtitle": "The Definitive Guide for JavaScript Developers",
      "author": "Nicholas C. Zakas",
      "publisher": "No Starch Press",
      "description": "ECMAScript 6 represents the biggest update to the core of JavaScript in the history of the language. In Understanding ECMAScript 6, expert developer Nicholas C. Zakas provides a complete guide to the object types, syntax, and other exciting changes that ECMAScript 6 brings to JavaScript."
    }
])

Erstellen eines Textindex

Wir müssen einen Textindex für die Felder erstellen, um die Textsuche durchzuführen. Wir können dies für einzelne oder mehrere Felder erstellen. Die folgende Anweisung erstellt einen Textindex für ein einzelnes Feld.

>db.books.createIndex({"description":"text"})

Wir erstellen einen Textindex für die Beschreibung und Untertitel Felder für dieses Tutorial. Wir können in MongoDB nur einen Textindex pro Sammlung erstellen. Wir erstellen also einen zusammengesetzten Textindex mit der folgenden Anweisung.

>db.books.createIndex({"subtitle":"text","description":"text"})

Jetzt werden wir versuchen, Dokumente zu suchen, die die Schlüsselwörter 'ECMAScript' in der Beschreibung haben und Untertitel Felder. Dazu können wir die folgende Anweisung verwenden.

db.books.find({$text: {$search: "ECMAScript"}})

Beispiel

>db.books.find({$text: {$search: "ECMAScript"}},{ subtitle: 1, description: 1 })
	{
    "_id" : ObjectId("602b09cb3cb6144ada1c62fe"),
    "subtitle" : "The Definitive Guide for JavaScript Developers",
    "description" : "ECMAScript 6 represents the biggest update to the core of JavaScript in the history of the language. In Understanding ECMAScript 6, expert developer Nicholas C. Zakas provides a complete guide to the object types, syntax, and other exciting changes that ECMAScript 6 brings to JavaScript."
	}
>

Phrasen

Sie können über den Textindex nach Phrasen suchen. Standardmäßig führt die Textsuche eine ODER-Suche nach allen Wörtern im Ausdruck durch. Wenn Sie nach „modernen Designmustern“ suchen möchten, wird nach Dokumenten mit den Schlüsselwörtern entweder modern, Design oder Muster gesucht.

Beispiel

>db.books.find({$text: {$search: "modern design patterns"}},{ subtitle: 1, description: 1 })
	{
    "_id" : ObjectId("602b098f3cb6144ada1c2ea1"),
    "subtitle" : "A JavaScript and jQuery Developer's Guide",
    "description" : "With Learning JavaScript Design Patterns, you'll learn how to write beautiful, structured, and maintainable JavaScript by applying classical and modern design patterns to the language. If you want to keep your code efficient, more manageable, and up-to-date with the latest best practices, this book is for you."
	},
	{
    "_id" : ObjectId("602b09b93cb6144ada1c4bca"),
    "subtitle" : "Robust Web Architecture with Node, HTML5, and Modern JS Libraries",
    "description" : "Take advantage of JavaScript's power to build robust web-scale or enterprise applications that are easy to extend and maintain. By applying the design patterns outlined in this practical book, experienced JavaScript developers will learn how to write flexible and resilient code that's easier-yes, easier-to work with as your code base grows.",
	},
	{
    "_id" : ObjectId("602b095c3cb6144ada1c1028"),
    "subtitle" : "A Modern Introduction to Programming",
    "description" : "JavaScript lies at the heart of almost every modern web application, from social apps to the newest browser-based games. Though simple for beginners to pick up and play with, JavaScript is a flexible, complex language that you can use to build full-scale applications."
	}
>

Wenn Sie nach genauen Ausdrücken suchen möchten, z. B. Dokumente mit „modernen Designmustern“, können Sie dies tun, indem Sie im Suchtext doppelte Anführungszeichen angeben.

Beispiel

>db.books.find({$text: {$search: "\"modern design patterns\""}},{ subtitle: 1, description: 1 })
	{
    "_id" : ObjectId("602b098f3cb6144ada1c2ea1"),
    "subtitle" : "A JavaScript and jQuery Developer's Guide",
    "description" : "With Learning JavaScript Design Patterns, you'll learn how to write beautiful, structured, and maintainable JavaScript by applying classical and modern design patterns to the language. If you want to keep your code efficient, more manageable, and up-to-date with the latest best practices, this book is for you."
}

Negationen

Wenn Sie die Dokumente ausschließen möchten, die ein bestimmtes Wort enthalten, können Sie eine Negationssuche verwenden. Wenn Sie beispielsweise alle Dokumente mit „JavaScript“, aber nicht „HTML5“ oder „ECMAScript“ durchsuchen möchten, können Sie wie im folgenden Beispiel suchen.

Beispiel

>db.books.find({$text: {$search: "JavaScript -HTML5 -ECMAScript"}},{ subtitle: 1, description: 1 })
	{
    "_id" : ObjectId("602b098f3cb6144ada1c2ea1"),
    "subtitle" : "A JavaScript and jQuery Developer's Guide",
    "description" : "With Learning JavaScript Design Patterns, you'll learn how to write beautiful, structured, and maintainable JavaScript by applying classical and modern design patterns to the language. If you want to keep your code efficient, more manageable, and up-to-date with the latest best practices, this book is for you."
	},
	{
    "_id" : ObjectId("602b09a83cb6144ada1c4973"),
    "subtitle" : "An In-Depth Guide for Programmers",
    "description" : "Like it or not, JavaScript is everywhere these days, from browser to server to mobile and now you, too, need to learn the language or dive deeper than you have. This concise book guides you into and through JavaScript, written by a veteran programmer who once found himself in the same position."
	},
	{
    "_id" : ObjectId("602b095c3cb6144ada1c1028"),
    "subtitle" : "A Modern Introduction to Programming",
    "description" : "JavaScript lies at the heart of almost every modern web application, from social apps to the newest browser-based games. Though simple for beginners to pick up and play with, JavaScript is a flexible, complex language that you can use to build full-scale applications."
	}

Ergebnis der Textsuche

Die Textsuche stellt jedem Dokument eine Bewertung bereit, die die Relevanz des Dokuments für die Suchanfrage darstellt. Diese Punktzahl kann verwendet werden, um alle im Suchergebnis zurückgegebenen Datensätze zu sortieren. Eine höhere Punktzahl weist auf eine relevanteste Übereinstimmung hin.

Beispiel

>db.books.find({$text: {$search: "JavaScript "}},{score: {$meta: "textScore"}, subtitle: 1, description: 1 }).sort({score:{$meta:"textScore"}})
	{
    "_id" : ObjectId("602b098f3cb6144ada1c2ea1"),
    "subtitle" : "A JavaScript and jQuery Developer's Guide",
    "description" : "With Learning JavaScript Design Patterns, you'll learn how to write beautiful, structured, and maintainable JavaScript by applying classical and modern design patterns to the language. If you want to keep your code efficient, more manageable, and up-to-date with the latest best practices, this book is for you.",
    "score" : 1.43269230769231
	},
	{
    "_id" : ObjectId("602b09cb3cb6144ada1c62fe"),
    "subtitle" : "The Definitive Guide for JavaScript Developers",
    "description" : "ECMAScript 6 represents the biggest update to the core of JavaScript in the history of the language. In Understanding ECMAScript 6, expert developer Nicholas C. Zakas provides a complete guide to the object types, syntax, and other exciting changes that ECMAScript 6 brings to JavaScript.",
    "score" : 1.42672413793103
	},
	{
    "_id" : ObjectId("602b09a83cb6144ada1c4973"),
    "subtitle" : "An In-Depth Guide for Programmers",
    "description" : "Like it or not, JavaScript is everywhere these days, from browser to server to mobile and now you, too, need to learn the language or dive deeper than you have. This concise book guides you into and through JavaScript, written by a veteran programmer who once found himself in the same position.",
    "score" : 0.818181818181818
	},
	{
    "_id" : ObjectId("602b095c3cb6144ada1c1028"),
    "subtitle" : "A Modern Introduction to Programming",
    "description" : "JavaScript lies at the heart of almost every modern web application, from social apps to the newest browser-based games. Though simple for beginners to pick up and play with, JavaScript is a flexible, complex language that you can use to build full-scale applications.",
    "score" : 0.801724137931034
	},
	{
    "_id" : ObjectId("602b09b93cb6144ada1c4bca"),
    "subtitle" : "Robust Web Architecture with Node, HTML5, and Modern JS Libraries",
    "description" : "Take advantage of JavaScript's power to build robust web-scale or enterprise applications that are easy to extend and maintain. By applying the design patterns outlined in this practical book, experienced JavaScript developers will learn how to write flexible and resilient code that's easier-yes, easier-to work with as your codebase grows.",
    "score" : 0.792857142857143
	}

Stoppwörter

Der $text-Operator filtert die sprachspezifischen Stoppwörter heraus, z. B. a, an, the und im Englischen. Die folgende Suche gibt kein Dokument im Ergebnis zurück.

Beispiel

>db.books.find({$text: {$search: "is"}},{subtitle: 1, description: 1 })
	Fetched 0 record(s)

Wörter mit Stamm

Der $text-Operator stimmt mit dem vollständigen Stammwort überein. Wenn also ein Dokumentfeld das Wort lernen oder lernen enthält, würde eine Suche nach dem Begriff lernen oder lernen dasselbe ergeben.

Beispiel

>db.books.find({$text: {$search: " learn"}},{subtitle: 1, description: 1 }) or >db.books.find({$text: {$search: " learning"}},{subtitle: 1, description: 1 })
	{
    "_id" : ObjectId("602b098f3cb6144ada1c2ea1"),
    "subtitle" : "A JavaScript and jQuery Developer's Guide",
    "description" : "With Learning JavaScript Design Patterns, you'll learn how to write beautiful, structured, and maintainable JavaScript by applying classical and modern design patterns to the language. If you want to keep your code efficient, more manageable, and up-to-date with the latest best practices, this book is for you."
	},
	{
    "_id" : ObjectId("602b09a83cb6144ada1c4973"),
    "subtitle" : "An In-Depth Guide for Programmers",
    "description" : "Like it or not, JavaScript is everywhere these days, from browser to server to mobile and now you, too, need to learn the language or dive deeper than you have. This concise book guides you into and through JavaScript, written by a veteran programmer who once found himself in the same position."
	},
	{
    "_id" : ObjectId("602b09b93cb6144ada1c4bca"),
    "subtitle" : "Robust Web Architecture with Node, HTML5, and Modern JS Libraries",
    "description" : "Take advantage of JavaScript's power to build robust web-scale or enterprise applications that are easy to extend and maintain. By applying the design patterns outlined in this practical book, experienced JavaScript developers will learn how to write flexible and resilient code that's easier-yes, easier-to work with as your codebase grows."
	}

Fazit

Ich hoffe, Sie haben heute etwas Neues gelernt. Hier ist ein interessanter Artikel über Self-Hosted MongoDB. Ich lade Sie auch ein, Dinge selbst auszuprobieren und Ihre Erfahrungen im Kommentarbereich zu teilen. Wenn Sie Probleme mit einer der oben genannten Definitionen haben, können Sie mich außerdem gerne im Kommentarbereich unten fragen.