Project: codever
- File: 1586782890001_add-codelets-indexes-DONE.js
Full text search is supported in Mongo by using a text index. Text indexes can include any field whose value is a string,
or an array of string elements, to which you can give weights. For a text index, the weight of an indexed
field denotes the significance of the field relative to the other indexed fields in terms of the text search score.
db.snippets.createIndex(
{
title: "text",
tags: "text",
"codeSnippets.comment": "text",
"codeSnippets.code": "text",
sourceUrl: "text"
},
{
weights: {
title: 8,
tags: 13,
"codeSnippets.comment": 3,
"codeSnippets.code": 1,
sourceUrl: 1
},
name: "full_text_search",
default_language: "none",
language_override: "none"
}
);
For each indexed field in the document, MongoDB multiplies the number of matches by the weight and sums the results.
Using this sum, MongoDB then calculates the score for the document.
You then can use the $meta operator for details
on returning and sorting by text scores, as in the snippet below:
let getPublicBookmarksForSearchedTerms = async function (nonSpecialSearchTerms, page, limit, sort, specialSearchFilters, searchInclude) {
let filter = {
public: true
}
if ( nonSpecialSearchTerms.length > 0 ) {
if(searchInclude === 'any') {
filter.$text = {$search: nonSpecialSearchTerms.join(' ')}
} else {
filter.$text = {$search: bookmarksSearchHelper.generateFullSearchText(nonSpecialSearchTerms)};
}
}
addSpecialSearchFiltersToMongoFilter(specialSearchFilters, filter);
let sortBy = {};
if ( sort === 'newest' ) {
sortBy.createdAt = -1;
} else {
sortBy.score = {$meta: "textScore"}
}
let bookmarks = await Bookmark.find(
filter,
{
score: {$meta: "textScore"}
}
)
.sort(sortBy)
.skip((page - 1) * limit)
.limit(limit)
.lean()
.exec();
return bookmarks;
}
Reference -
https://docs.mongodb.com/manual/core/index-text/
Shared with from Codever.
👉 Use the Copy to mine
functionality to copy this snippet to your own personal collection and easy manage
your code snippets.
Codever is open source on Github ⭐🙏