如何在MongoDB $文本搜索中使用AND和NOT

use*_*ser 5 mongodb mongodb-query

如果有人提出这个问题,我会事先道歉,我没有找到答案就进行了搜索.

我想在MongoDB中进行搜索,然后创建索引并执行类似的操作

db.myCollection.runCommand( "text", { search: "myWord" } )
Run Code Online (Sandbox Code Playgroud)

这很好用.

我也可以

db.myCollection.runCommand( "text", { search: "myWord1 myWord2" } )
Run Code Online (Sandbox Code Playgroud)

它会搜索两个单词.

我可以通过询问找到两个单词来进行上述搜索吗?(我知道我可以搜索第一个单词然后搜索结果中的第二个单词,但我想知道是否有更好的方法).

此外,是否可以指定要拒绝的单词(例如,搜索单词"test",而不是"testing").

我想知道我是否可以在不使用外部工具的情况下在mongoDB中执行此操作.

Nei*_*unn 13

您可以使用一些选项来进行文本搜索以满足这些需求.请考虑以下文件:

{ "text" : "cake" }
{ "text" : "sale" }
{ "text" : "sale cake" }
{ "text" : "cake sale" }
{ "text" : "dress sale" }
{ "text" : "cake sale monday" }
Run Code Online (Sandbox Code Playgroud)

词的默认"名单"是一个包容性,但如果你wan't的包容你"报价"的话:

db.words.find( { "$text": { "$search": "\"cake\" \"sale\"" } },{_id: 0})
{ "text" : "cake sale" }
{ "text" : "sale cake" }
{ "text" : "cake sale monday" }
Run Code Online (Sandbox Code Playgroud)

如果要排除单词,则前缀为-:

db.words.find( { "$text": { "$search": "\"cake\" \"sale\" -monday" } },{_id: 0})
{ "text" : "cake sale" }
{ "text" : "sale cake" }
Run Code Online (Sandbox Code Playgroud)

如果你想将其中的一部分作为一个确切的短语,那么你"引用"整个短语:

db.words.find( { "$text": { "$search": "\"cake sale\" -monday" } },{_id: 0})
{ "text" : "cake sale" }
Run Code Online (Sandbox Code Playgroud)

虽然词干有问题,所以:

db.words.find( { "$text": { "$search": "test -testing" } },{_id: 0})
Run Code Online (Sandbox Code Playgroud)

实际上不会返回结果.

有关$text示例,请参阅运算符文档.目前并非所有人都在那里,但它正在变得更好.

  • @ user79303好点。MongoDB 2.6之前需要`runCommand`,但是现在文本搜索已与标准查询引擎以及索引接口上的其他标准化集成在一起。在本发行版之后,不建议在文本搜索中使用“ runCommand”,并且应在包括聚合管道在内的标准查询中使用“ $ text”运算符。如答案中所示,这些是可用的修饰语,可用于当前支持的**和**短语**和**单词排除**。 (2认同)