MongoDB文本搜索和多个搜索词

MongoDB文本搜索和多个搜索词,mongodb,full-text-search,Mongodb,Full Text Search,我在数组“键”上有一个索引,我用它为我的应用程序提供全文功能 随着2.4.3的发布,我想使用“text”索引类型。我在数组“键”上保证了一个“文本”索引类型,它似乎工作得非常快(比我以前的关键字全文方法快) 问题是,我的应用程序假设字段是包含的(和)。默认情况下,文本搜索将删除我的参数 有人知道一种包含文本搜索的方法吗 例如: db.supplies.runCommand("text", {search:"printer ink"}) 应使用打印机和墨水返回结果,而不是使用打印机或墨水返回所有

我在数组“键”上有一个索引,我用它为我的应用程序提供全文功能

随着2.4.3的发布,我想使用“text”索引类型。我在数组“键”上保证了一个“文本”索引类型,它似乎工作得非常快(比我以前的关键字全文方法快)

问题是,我的应用程序假设字段是包含的(和)。默认情况下,文本搜索将删除我的参数

有人知道一种包含文本搜索的方法吗

例如:

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”}})
和在mongo
db.mycollection.createIndex({“fieldName”:“text”})
重要提示:仅适用于双引号!单引号的作用类似于标准的$text搜索。在搜索多个短语时,monogdb似乎存在一些问题。我有一个值为456 ABC的字段。当我使用关键字
{“$search”:“\'45\“\'ABC\\”}
{“$search”:“\'456\'AB\\”}
进行多短语搜索时,它返回文档。它不应该返回结果,因为这两个短语并不完全匹配。我非常希望找到一种不会消除词干的解决方案。你能找到词干的解决方案吗?在使用Lucene的MongoDB Atlas中,有一种新的更好的方法来实现这一点:它支持词干和自动完成。