MongoDB文本搜索和多个搜索词

时间:2013-06-03 17:44:34

标签: mongodb full-text-search

我有一个数组的索引"键"我用来为我的应用程序提供全文功能。

随着2.4.3的发布,我想利用"文本"索引类型。我投了一个"文本"我的数组上的索引类型"键"它似乎工作超快(比我的旧关键字全文方法更快)。

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

有没有人知道如何运行文本搜索?

例如:

db.supplies.runCommand("text", {search:"printer ink"})

应该使用打印机和墨水返回结果,而不是使用打印机或墨水的所有结果。

4 个答案:

答案 0 :(得分:62)

尝试:

db.supplies.runCommand("text", {search:"\"printer\" \"ink\""})

此外,这是docs的引用:

  

如果搜索字符串包含短语,则搜索执行AND   搜索字符串中的任何其他术语;例如搜索“\”闪烁   闪烁的“小星星”寻找“闪烁的闪烁”和(“小”或“   “星”)。

希望有所帮助。

答案 1 :(得分:4)

您可以用双引号括起每个单词:

let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' ');
match.$text = { $search: keywords, $caseSensitive: false };

如果用户输入带引号的字符串,则存在缺点,这将无效。您必须先解析引用的字符串。

答案 2 :(得分:0)

正如@alecxe先前指出的,要对文本索引列进行AND搜索,您需要对每个搜索词加双引号。 以下是满足您需求的快速一线服务。

db.supplies.runCommand("text", {search: "printer ink".split(" ").map(str => "\""+str+"\"").join(' ')})

答案 3 :(得分:-1)

这是我在节点中使用子词进行搜索的简单函数。希望它可以帮助某人

假设用户搜索<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"> <input type="hidden" name="business" value="business@gmail.com"> <input type="hidden" name="cmd" value="_xclick"> <input type="hidden" name="item_name" value="2 Year Renewal"> <input type="hidden" name="amount" value="1.00"> <input type="hidden" name="currency_code" value="AUD"> <input type="hidden" name="first_name" value="John"> <input type="hidden" name="last_name" value="Doe"> <input type="hidden" name="address1" value="9 Elm Street"> <input type="hidden" name="address2" value="Apt 5"> <input type="hidden" name="city" value="Berwyn"> <input type="hidden" name="state" value="US"> <input type="hidden" name="zip" value="2200"> <input type="hidden" name="email" value="buyer@gmail.com"> <input type="hidden" name="no_note" value="0" /> <input type="image" name="submit" border="0" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynow_LG.gif" alt="Buy Now"> <img alt="" border="0" width="1" height="1" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" > <input type="hidden" name="notify_url" value="<?php echo $data['notify_url'];?> " /> <input type="hidden" name="cancel_return" value="<?php echo $data['cancel_url'];?> " /> <input type="hidden" name="return" value="<?php echo $data['thanks_page']; ?> " /> <input type="hidden" name="rm" value="2" /> <input type="hidden" name="lc" value="AU" /> <input type="hidden" name="no_shipping" value="0" /> </form>因此它应该满足打印机和墨水,但$ text搜索不允许这样做,所以这是我的简单功能:

pri nks

并在您的查询中使用它

    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;
  }