MongoDB文本搜索和多个搜索词
我在数组“键”上有一个索引,我用它为我的应用程序提供全文功能 随着2.4.3的发布,我想使用“text”索引类型。我在数组“键”上保证了一个“文本”索引类型,它似乎工作得非常快(比我以前的关键字全文方法快) 问题是,我的应用程序假设字段是包含的(和)。默认情况下,文本搜索将删除我的参数 有人知道一种包含文本搜索的方法吗 例如:MongoDB文本搜索和多个搜索词,mongodb,full-text-search,Mongodb,Full Text Search,我在数组“键”上有一个索引,我用它为我的应用程序提供全文功能 随着2.4.3的发布,我想使用“text”索引类型。我在数组“键”上保证了一个“文本”索引类型,它似乎工作得非常快(比我以前的关键字全文方法快) 问题是,我的应用程序假设字段是包含的(和)。默认情况下,文本搜索将删除我的参数 有人知道一种包含文本搜索的方法吗 例如: db.supplies.runCommand("text", {search:"printer ink"}) 应使用打印机和墨水返回结果,而不是使用打印机或墨水返回所有
db.supplies.runCommand("text", {search:"printer ink"})
应使用打印机和墨水返回结果,而不是使用打印机或墨水返回所有结果。请尝试:
db.supplies.runCommand("text", {search:"\"printer\" \"ink\""})
另外,这里有一段引语:
如果搜索字符串包括短语,则搜索将使用AND执行
搜索字符串中的任何其他术语;e、 g.搜索“\”闪烁
闪烁\“小星星”搜索“闪烁闪烁”和(“小”或
“明星”)
希望对您有所帮助。您可以将每个单词用双引号括起来:
let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' ');
match.$text = { $search: keywords, $caseSensitive: false };
如果用户输入带引号的字符串,则会有一个缺点,这将不起作用。您必须首先解析带引号的字符串。这里有一个简单的函数,我使用node中的子词进行搜索。希望它能帮助别人 让我们假设用户搜索
pri-nks
,因此它应该满足打印机和墨水的要求,但$text search不允许这样做,因此下面是我的简单功能:
var makeTextFilter = (text) => {
var wordSplited = text.split(/\s+/);
/** Regex generation for words */
var regToMatch = new RegExp(wordSplited.join("|"), 'gi');
let filter = [];
searchFieldArray.map((item,i) => {
filter.push({});
filter[i][item] = {
$regex: regToMatch,
$options: 'i'
}
})
return filter;
}
并在您的查询中像这样使用它
let query = {...query, $or: makeTextFilter(textInputFromUser)}
tableName.find(query, function (err, cargo_list)
正如@alecxe前面指出的,要在文本索引列上执行和搜索,您需要对每个搜索词进行双引号引用。 下面是一个快速的一行为您的要求
db.supplies.runCommand("text", {search: "printer ink".split(" ").map(str => "\""+str+"\"").join(' ')})
你。摇滚乐。先生谢谢。请注意,这会将文本索引的一些很酷的特性,比如词干插入垃圾箱。如果我的文本是
,这里有一些很酷的测试条目
,我会在{$search:“entry”}
中找到它,但在{$search:“\'entry\\”}
中找不到它。下面是一个JS中一系列单词的示例,如果有帮助的话,还有索引创建:var queryString='\'''+q.split('.)。join('\'\''''''''''''''''''''''''''''>)+++';var res=mycollection.find({$text:{$search:queryString,$language:“fr”}})
和在mongodb.mycollection.createIndex({“fieldName”:“text”})
重要提示:仅适用于双引号!单引号的作用类似于标准的$text搜索。在搜索多个短语时,monogdb似乎存在一些问题。我有一个值为456 ABC的字段。当我使用关键字{“$search”:“\'45\“\'ABC\\”}
或{“$search”:“\'456\'AB\\”}
进行多短语搜索时,它返回文档。它不应该返回结果,因为这两个短语并不完全匹配。我非常希望找到一种不会消除词干的解决方案。你能找到词干的解决方案吗?在使用Lucene的MongoDB Atlas中,有一种新的更好的方法来实现这一点:它支持词干和自动完成。