2017-09-28 60 views
1

我使用MongoDB,版本3.4.5,我試圖用 - (減號)排除一個詞。 由於任何原因,它不起作用。 這是我的嘗試:

db.Product.find() 
    { "_id" : ObjectId("59cbfcd01889a9fd89a3565c"), "name" : "Produkt Neu", ... 
    { "_id" : ObjectId("59cc7d941889a4f4c2f43b14"), "name" : "Produkt2", ... 

db.Product.find({ $text: { $search: 'Produkt -Neu' } }); 

db.Product.find({ $text: { $search: "Produkt -Neu" } }); 

db.Product.find({ $text: { $search: "Produkt2" } }); 
    { "_id" : ObjectId("59cc7d941889a4f4c2f43b14"), "name" : "Produkt2", ... 

db.Product.dropIndexes() 

db.Product.createIndex({ name: "text" }) 
    { 
     "nIndexesWas" : 2, 
     "msg" : "non-_id indexes dropped for collection", 
     "ok" : 1 
    } 

    { 
     "createdCollectionAutomatically" : false, 
     "numIndexesBefore" : 1, 
     "numIndexesAfter" : 2, 
     "ok" : 1 
    } 

db.Product.find({ $text: { $search: "Produkt -Neu" } }); 

db.Product.find({ $text: { $search: "Produkt Neu" } }); 
    { "_id" : ObjectId("59cbfcd01889a9fd89a3565c"), "name" : "Produkt Neu", ... 

有誰知道我有什麼才能做的就是它一起工作 - (減號)。

回答

1

我創建了一個集合:Product持下列文件...

{ 
    "_id" : ObjectId("59d0ada3c26584cd8b79fc51"), 
    "name" : "Produkt Neu" 
} 

{ 
    "_id" : ObjectId("59d0adafc26584cd8b79fc54"), 
    "name" : "Produkt2" 
} 

...我宣佈這個集合的文本索引如下:

db.Product.createIndex({ name: "text" }) 

我跑以下問題忠實地複製您的問題中描述的情況:

// returns one document since there is one document 
// which has the text indexed value: "Produkt Neu" 
db.Product.find({ $text: { $search: "Produkt Neu" } }); 

// returns no documents since there is no document 
// which has the text indexed value: "Produkt2" 
db.Product.find({ $text: { $search: "Produkt -Neu" } }) 

你是,我認爲,這期待...查詢

db.Product.find({ $text: { $search: "Produkt -Neu" } }) 

...返回,理由第二文檔不包括Neu應該允許在具有name=Produkt2該文檔的比賽,但這個並不怎麼樣的MongoDB $text搜索工作。 MongoDB $text搜索不支持部分匹配所以搜索項Produkt -Neu(其求值爲Produkt)將不匹配Produkt2。爲了驗證這一點,我跑下面的查詢:

db.Product.find({ $text: { $search: "Produkt2 -Neu" } }) 

該查詢返回第二個文檔(即一個與name=Produkt2),這證明了連字符減號(-)成功地否定術語:Neu

在附註上; MongoDB的文本索引不支持的語言而產生,以驗證這種行爲我添加了以下文件...

{ 
    "_id" : ObjectId("59d0b2b4c26584cd8b79fd7c"), 
    "name" : "Produkts" 
} 

...然後跑到這個查詢...

db.Product.find({ $text: { $search: "Produkt -Neu" } }); 

該查詢返回文檔與name=Produkts,因爲ProductProdukts的詞幹。

總之,$text搜索將找到匹配,其中每個搜索詞具有(a)文本索引中整個世界上的匹配或(b)是文本索引中整個詞的識別詞幹。注意:還有詞組匹配,但這些與您問題中的示例無關。使用連字符減號用於更改搜索項,但不會改變搜索項的評估方式。

更多詳細信息in the docs並且MongoDB存在與supporting partial matching on text indexes有關的未決問題。

如果您確實需要支持部分匹配,那麼您可能需要放棄文本索引並改爲使用$regex運算符。值得注意的是,$regex運算符的索引覆蓋率可能並非您所期望的,簡單總結如下:如果您的搜索值被錨定(即Produk而不是rodukt),那麼MongoDB可以使用索引,否則它不能。