Cân nhắc sử dụng chỉ mục văn bản
với $text
tìm kiếm
. Nó có thể là một giải pháp tốt hơn nhiều so với việc sử dụng các biểu thức chính quy. Tuy nhiên, tìm kiếm văn bản trả về tài liệu dựa trên thuật toán tính điểm, vì vậy bạn có thể nhận được một số kết quả không có tất cả các từ khóa bạn đang tìm kiếm.
Nếu bạn không thể hoặc không muốn thêm chỉ mục văn bản vào trường này, việc sử dụng một cụm từ thông dụng sẽ khá khó khăn vì bạn không biết thứ tự xuất hiện của những từ này. Tôi không khẳng định là không thể viết được, nhưng bạn sẽ kết thúc với một sự ghê tởm khủng khiếp ngay cả đối với các tiêu chuẩn regex. Sẽ dễ dàng hơn nhiều nếu sử dụng toán tử regex nhiều lần bằng cách sử dụng $and
nhà điều hành.
Ngoài ra, sử dụng dấu cách làm dấu phân cách sẽ không thành công khi từ ở đầu hoặc cuối chuỗi hoặc theo sau là dấu chấm hoặc dấu phẩy. Sử dụng mã thông báo ranh giới từ (\b
) thay vào đó.
collection.find(
{ $and : [
{'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
]
});
Hãy nhớ rằng đây là một truy vấn thực sự chậm, bởi vì nó sẽ chạy ba biểu thức chính quy này trên mọi tài liệu của bộ sưu tập. Khi đây là một truy vấn quan trọng về hiệu suất, hãy nghiêm túc xem xét liệu chỉ mục văn bản có thực sự không. Không thực hiện được, điều cuối cùng cần nắm được là trích xuất bất kỳ từ khóa nào từ documenttextfield
trường mà ai đó có thể tìm kiếm (có thể là mọi từ duy nhất trong đó) vào một trường mảng mới documenttextfield_keywords
, tạo một chỉ mục bình thường trên trường đó và tìm kiếm trên trường đó bằng $all
nhà điều hành
(không yêu cầu biểu thức chính quy trong trường hợp đó).