2015-07-27 17 views
6

Vì vậy, theo tài liệu MongoDB,MongoDB tìm kiếm toàn chữ với cụm từ chính xác không trở lại kết quả mong đợi

nếu một lĩnh vực tài liệu chứa các blueberry từ, một tìm kiếm trên màu xanh hạn sẽ không phù hợp với tài liệu

Điều này tốt cho trường hợp sử dụng của tôi, đó là điều tôi muốn xảy ra. Tuy nhiên, do các mục DB sau:

> db.test.drop() 
> db.test.insert({ "t" : "Men's Fashion" }) 
> db.test.insert({ "t" : "Women's Fashion" }) 
> db.test.ensureIndex({ "t" : "text" }) 

Một tìm kiếm cho lợi nhuận của Men kết quả mong đợi:

> db.test.find({ "$text" : { "$search" : "\"Men's\"" } }, { "_id" : 0 }) 
{ "t" : "Men's Fashion" } 

Tuy nhiên việc tìm kiếm thời trang toàn bộ cụm từ nam, bất ngờ cũng trả về thời trang của phụ nữ:

> db.test.find({ "$text" : { "$search" : "\"Men's Fashion\"" } }, { "_id" : 0 }) 
{ "t" : "Women's Fashion" } 
{ "t" : "Men's Fashion" } 

Tôi đã thử "\"Men's\"\"Fashion\"" cũng với kết quả tương tự. Có cách giải quyết/lừa đảo nào để có được cụm từ đầy đủ để chỉ trả lại toàn bộ từ phù hợp không?

Tôi đang sử dụng Mongo 2.6.4. Thật thú vị, nó có điểm số của phụ nữ thấp hơn nam giới.

+1

Câu hỏi hay. Tôi thấy cùng một hành vi tò mò bằng cách sử dụng Mongo 3.0.4. – JohnnyHK

+0

vì THỜI TRANG woMEN phù hợp với THỜI TRANG MEN ... –

Trả lời

2

Kết quả bạn thấy là vì THỜI TRANG của woMEN phù hợp với THỜI TRANG MEN theo nghĩa là chuỗi tìm kiếm trong chuỗi cần tìm kiếm.

Các hành vi phù hợp không xảy ra với tập dữ liệu này:

/* 1 */ 
{ 
    "_id" : ObjectId("55ca6060fb286267994d297e"), 
    "text" : "potato pancake" 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("55ca6075fb286267994d297f"), 
    "text" : "potato salad" 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("55ca612ffb286267994d2980"), 
    "text" : "potato's pancake" 
} 

với truy vấn

db.getCollection('rudy_test').find({$text : {"$search" : "\"potato pancake\""}}) 

Nó gây ra bởi thực tế rằng mục có chứa toàn bộ truy vấn, tỷ số là chỉ thấp hơn bởi vì nó cũng chứa các văn bản khác. Thay vào đó, bạn có thể sử dụng một số Regular Expression Query (ví dụ: db.test.find({t : {$regex : /^Men\'s Fashion$/}})).

+0

Jason là chính xác. Câu hỏi cũng được đặt ra trong https://jira.mongodb.org/browse/SERVER-20307 –

+0

Có nó có chứa chuỗi, nhưng nó phải được loại trừ khỏi kết quả bởi vì nó không phải là một kết hợp toàn bộ từ. Hoặc là, hoặc tìm kiếm "\" Đàn ông \ "" cũng phải trả về woMEN - nhưng không. Về cơ bản nó là hành vi không phù hợp tùy thuộc vào số lượng từ trong cụm từ, và từ những gì tôi hiểu từ phản ứng của Dan trong báo cáo lỗi, nó thực sự là một lỗi được lên kế hoạch để sửa chữa. – JBY

+0

Ngoài ra, tiếc là regex không phải là một giải pháp thích hợp vì bạn mất ưu điểm của tìm kiếm văn bản (bắt nguồn, ghi điểm và tốc độ quan trọng nhất). – JBY

Các vấn đề liên quan