0

我目前在MongoDB中有全文搜索功能的一些问题。特别是当试图匹配确切的短语。MongoDB全文搜索 - 匹配单词和确切短语

我正在测试mongo shell中的功能,但最终我将使用Spring Data MongoDB和Java。

所以我第一次尝试运行此命令来搜索词“延迟”,“迟到”和“时间”一词

db.mycollection.find({ $text: { $search: "delay late \"on time\"" } }).explain(true); 

并将得到解释查询的告诉我说:

"parsedTextQuery" : { 
    "terms" : [ 
      "delay", 
      "late", 
      "time" 
    ], 
    "negatedTerms" : [ ], 
    "phrases" : [ 
      "on time" 
    ], 
    "negatedPhrases" : [ ] }, 

这里的问题是我不想搜索单词“时间”,而是“按时”。我确实想要寻找延迟和迟到,理想情况下不想阻止词干。

我尝试了一些不同的排列,例如

db.mycollection.find({ $text: { $search: "delay late \"'on time'\"" } }).explain(true); 

db.mycollection.find({ $text: { $search: "delay late \"on\" \"time\"" } }).explain(true); 

但似乎无法得到正确的结果。关于这方面的文档我看不出任何明显的东西。

为了我的目的,我应该使用单词的全文搜索和短语的正则表达式搜索功能吗?

目前正在使用MongoDB版本2.6.5。谢谢。

回答

1

您是否尝试过文字搜索以查看其行为是否不正确?它按预期工作,我对MongoDB的2.6.7:

> db.test.drop() 
> db.test.insert({ "t" : "I'm on time, not late or delayed" }) 
> db.test.insert({ "t" : "I'm either late or delayed" }) 
> db.test.insert({ "t" : "Time flies like a banana" }) 
> db.test.ensureIndex({ "t" : "text" }) 

> db.test.find({ "$text" : { "$search" : "time late delay" } }, { "_id" : 0 }) 
{ "t" : "I'm on time, not late or delayed" } 
{ "t" : "Time flies like a banana" } 
{ "t" : "I'm either late or delayed" } 

> db.test.find({ "$text" : { "$search" : "late delay" } }, { "_id" : 0 }) 
{ "t" : "I'm on time, not late or delayed" } 
{ "t" : "I'm either late or delayed" } 

> db.test.find({ "$text" : { "$search" : "late delay \"on time\"" } }, { "_id" : 0 }) 
{ "t" : "I'm on time, not late or delayed" } 

为什么是“时间”的解释terms阵列?因为如果短语"on time"发生在文档中,则术语time也必须如此。 MongoDB在可以帮助查找短语的范围内使用文本索引,然后检查索引结果以查看哪个实际上与完整短语匹配,而不仅仅是短语中的术语。

+0

嗨,感谢您的回复。我得到了与您的示例相同的结果,我想我的困惑仍然围绕您提供的第三个示例查询。 在第三个例子中,我会希望查询匹配你记录的第三和第二条记录,因为第二条记录匹配“迟到”和“延迟”。 我想我无法理解它是否在查找短语时忽略了其他术语? – robarthur1 2015-02-09 08:35:13

+0

经过一番搜索之后,我得到的印象是,当搜索一个短语时,它使用逻辑AND而不是OR,它使用单个单词。 您是否知道使用逻辑OR搜索多个单词和短语的方法,而无需运行多重查询和重复过滤?谢谢。 – robarthur1 2015-02-09 09:09:00

+0

你能给我一个你想要的例子吗?我认为这对我来说是最容易理解的。这个问题应该是一个新问题,我想。 – wdberkeley 2015-02-09 15:45:46