2017-09-18 34 views
1

好的,所以我很困惑這種行爲。看起來不一致和奇怪,尤其是因爲我讀過Mongo不應該支持全文搜索中的部分搜索術語。我正在使用Mongo DB社區服務器3.4.7版。我正在從Mongo shell進行這些測試。

因此,我有一個分配了文本索引的Mongo DB集合。我創建這樣的指標:

db.submissions.createIndex({"$**":"text"}) 

有了這個集合,其中包含這兩個值中的文件:

「克雷格」

「鮑勃博士」。

我的目標是對其中有多個匹配項的文檔進行文本搜索。

所以,這裏是我所運行的測試,和他們不一致的輸出:

單個術語,完整

db.submissions.find({"$text":{"$search":"\"Craig\""}}) 

結果:讓我與它該值的文檔。

單個術語,部分

db.submissions.find({"$text":{"$search":"\"Crai\""}}) 

結果:返回沒什麼,因爲這部分搜索術語不完全匹配文檔中任何事情。

多重條件,完善的

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bob\""}}) 

結果:返回與無論是在它這些條款的文件。

多個術語,一個部分

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}}) 

結果:返回一個與它兩方面的文件,儘管事實上,一個任期是局部的。沒有什麼符合「博醫生」

多個詞的文檔中,兩個分

db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}}) 

結果:返回一個與它兩方面的文件,儘管這兩個詞是部分並且不完整。文件中沒有任何內容與「Crai」或「Bo博士」相匹配。

問題

所以,這一切都歸結爲:爲什麼呢?爲什麼呢,當我用一個只有一個值的部分詞進行文本搜索時,沒有任何東西會被返回。當我用兩個部分詞語進行文本搜索時,我會得到匹配結果?它看起來很奇怪而且不一致。

謝謝。

+0

我面臨同樣的問題,[檢查這裏](https://stackoverflow.com/questions/46288384/text-indexes-mongodb-minimum-length-of-search-string) –

回答

3

MongoDB $text搜索不支持部分匹配。 MongoDB允許對字符串內容進行文本搜索查詢,支持不區分大小寫,分隔符,停用詞和詞幹。而且搜索字符串中的術語默認情況下是OR。

以你的(非常有用:)例子一個接一個:

單個術語,部分

// returns nothing because there is no world word with the value `Crai` in your 
// text index and there is no whole word for which `Crai` is a recognised stem 
db.submissions.find({"$text":{"$search":"\"Crai\""}}) 

多重條件,完善的

// returns the document because it contains all of these words 
// note in the text index Dr. Bob is not a single entry since "." is a delimiter 
db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bob\""}}) 

多個術語, ONE PARTIAL

// returns the document because it contains the whole word "Craig" and it 
// contains the whole word "Dr" 
db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}}) 

多個術語,兩個分

// returns the document because it contains the whole word "Dr" 
db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}}) 

記住,該$search串...

術語的字符串,MongoDB的解析和使用查詢文本索引。除非指定爲短語,否則MongoDB會執行邏輯搜索條件。

因此,如果您的$search字符串中至少有一個詞匹配,那麼MongoDB會匹配該文檔。

爲了驗證這一行爲,如果您編輯的文檔改變Dr. BobDrBob那麼下面的查詢將返回沒有文件:

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}}) 
db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}}) 

這些現在沒有返回比賽,因爲Dr不再是一個全字您的文本索引,因爲它沒有跟着.分隔符。

+0

哇,謝謝你非常徹底的迴應。我有關於文本搜索的最後一個問題。有沒有辦法讓所有條款100%包容。做了一些額外的測試,我發現如果其中一個條款與文檔匹配,它將獲取整個文檔。有沒有辦法做文本搜索,所以它會要求所有條件匹配? – user2223059

+0

除非指定爲短語,否則MongoDB會執行術語的邏輯或搜索。因此,搜索「快速棕色狗」將只返回文本索引中包含短語「快速棕色狗」的條目的文檔,而搜索「快速」「棕色」「狗」返回至少包含其中一個詞的文檔。 – glytching