我有一个数组的索引"键"我用来为我的应用程序提供全文功能。
随着2.4.3的发布,我想利用"文本"索引类型。我投了一个"文本"我的数组上的索引类型"键"它似乎工作超快(比我的旧关键字全文方法更快)。
问题是,我的应用程序假设字段是包含的(AND)。默认情况下,文本搜索OR我的参数。
有没有人知道如何运行文本搜索?
例如:
db.supplies.runCommand("text", {search:"printer ink"})
应该使用打印机和墨水返回结果,而不是使用打印机或墨水的所有结果。
答案 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;
}