Cách tốt nhất để thực hiện tìm kiếm toàn văn trong MongoDB và Mongoose


76

Tôi đang tìm kiếm trên Google từ nhiều ngày nay và tôi đã thử nhiều cách nhưng vẫn không thể thực hiện tìm kiếm toàn văn tốt trên bộ sưu tập người dùng của mình.

Tôi đã thử ElasticSearch nhưng không thể truy vấn và phân trang ...

Tôi đã thử nhiều plugin cho Mongoose như ElMongo, mongoose-full-text, Mongoosastic, v.v ... tất cả mọi người đều được ghi chép rất tệ và tôi không biết cách thực hiện tìm kiếm toàn văn tốt.

Vì vậy, bộ sưu tập của tôi là một bộ sưu tập bình thường:

user = {
  name: String,
  email: String,
  profile: {
    something: String,
    somethingElse: String
  }
}

Tôi có một đầu vào tìm kiếm trong một trang đơn giản POST, nếu tôi nhập hello worldnhững gì tôi cần là tìm kiếm trên toàn bộ các trường của bộ sưu tập các từ phù hợp với truy vấn tìm kiếm của tôi và nhận được kết quả.

Nó cũng sẽ thực sự tuyệt vời khi có các tùy chọn để xử lý phân trang như 10 mục trên mỗi trang hoặc thứ gì đó ...

Giải pháp tốt nhất để đạt được điều này là gì? Tôi đang sử dụng MongoDB 2.6. * Với Mongoose, NodeJS và ExpressJS.

Cảm ơn.

Câu trả lời:


194

Bạn có thể thêm chỉ mục văn bản vào định nghĩa giản đồ Mongoose của mình, cho phép bạn sử dụng $texttoán tử trong các findtruy vấn của mình để tìm kiếm tất cả các trường có trong chỉ mục văn bản.

Để tạo chỉ mục hỗ trợ tìm kiếm văn bản, hãy nói nameprofile.something:

var schema = new Schema({
  name: String,
  email: String,
  profile: {
    something: String,
    somethingElse: String
  }
});
schema.index({name: 'text', 'profile.something': 'text'});

Hoặc nếu bạn muốn bao gồm tất cả các trường chuỗi trong chỉ mục, hãy sử dụng '$**'ký tự đại diện:

schema.index({'$**': 'text'});

Điều này sẽ cho phép bạn thực hiện truy vấn tìm kiếm văn bản theo trang như:

MyModel.find({$text: {$search: searchString}})
       .skip(20)
       .limit(10)
       .exec(function(err, docs) { ... });

Để biết thêm chi tiết, hãy đọc toàn bộ tài liệu về Chỉ mục văn bản MongoDB .


1
Cảm ơn câu trả lời của bạn. Làm điều này không làm giảm hiệu suất MongoDB? Một câu hỏi nữa xin vui lòng: Tôi cũng có thể chọn các trường để lập chỉ mục?
Ayeye Brazo

4
@AyeyeBrazo Tôi đã cập nhật anser để hiển thị cách chọn các trường để lập chỉ mục. Việc thêm bất kỳ chỉ mục nào sẽ làm tăng chi phí trong quá trình chèn và cập nhật, cũng như các yêu cầu lưu trữ bổ sung, vì vậy điều đó luôn phải được xem xét.
JohnnyHK

4
sau thời gian dài tìm kiếm, câu trả lời của bạn là vua!
Holger D. Schauf

2
Có khả năng thực hiện tìm kiếm "wordA VÀ wordB" không? Và tìm kiếm một phần của từ?
Pumych

2
@Pumych kiểm tra docs.mongodb.com/manual/reference/operator/query/text/… để biết tìm kiếm phân biệt chữ hoa chữ thường
Prasanth Jaya vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.