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