Tôi có thể tối ưu hóa truy vấn Dữ liệu cốt lõi khi tìm kiếm các từ phù hợp trong văn bản không? (Câu hỏi này cũng liên quan đến sự khôn ngoan của SQL tùy chỉnh so với dữ liệu cốt lõi trên iPhone.)Cách tối ưu hóa truy vấn Dữ liệu lõi để tìm kiếm toàn văn
Tôi đang sử dụng một ứng dụng mới (iPhone) là công cụ tham khảo cầm tay cho cơ sở dữ liệu khoa học. Giao diện chính là chế độ xem bảng có thể tìm kiếm tiêu chuẩn và tôi muốn trả lời khi bạn nhập khi người dùng nhập từ mới. Từ phù hợp phải là tiền tố của các từ trong văn bản. Văn bản bao gồm 100.000 từ.
Trong nguyên mẫu của tôi, tôi đã mã hóa SQL trực tiếp. Tôi đã tạo một bảng "từ" riêng biệt chứa mọi từ trong các trường văn bản của thực thể chính. Tôi đã lập chỉ mục các từ và thực hiện tìm kiếm dọc theo các dòng của
SELECT id, * FROM textTable
JOIN (SELECT DISTINCT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz')
ON id=textTableId
LIMIT 50
Điều này chạy rất nhanh. Việc sử dụng IN cũng có thể hoạt động tốt, tức là
SELECT * FROM textTable
WHERE id IN (SELECT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz')
LIMIT 50
Giới hạn rất quan trọng và cho phép tôi hiển thị kết quả nhanh chóng. Tôi thông báo cho người dùng rằng có quá nhiều thứ để hiển thị nếu đạt đến giới hạn. Đây là kludgy.
Tôi đã dành nhiều ngày cuối cùng cân nhắc lợi thế của việc chuyển sang Dữ liệu cốt lõi, nhưng tôi lo lắng về việc thiếu kiểm soát trong lược đồ, lập chỉ mục và truy vấn một truy vấn quan trọng.
Về mặt lý thuyết, NSPredicate của textField MATCHES '.*\bfoo.*'
sẽ chỉ hoạt động, nhưng tôi chắc chắn nó sẽ chậm. Loại tìm kiếm văn bản này dường như quá phổ biến đến nỗi tôi tự hỏi cuộc tấn công thông thường là gì? Bạn sẽ tạo một thực thể từ như tôi đã làm ở trên và sử dụng một vị từ của "từ BEGINSWITH 'foo'"? Liệu nó có hoạt động nhanh như nguyên mẫu của tôi không? Dữ liệu cốt lõi có tự động tạo các chỉ mục phù hợp không? Tôi không thể tìm thấy bất kỳ phương tiện rõ ràng nào để tư vấn cho kho lưu trữ liên tục về các chỉ mục.
Tôi thấy một số lợi thế tốt đẹp của Dữ liệu cốt lõi trong ứng dụng iPhone của tôi. Việc cân nhắc các lỗi và bộ nhớ khác cho phép truy xuất cơ sở dữ liệu hiệu quả cho các truy vấn tableview mà không đặt giới hạn tùy ý. Việc quản lý đồ thị đối tượng cho phép tôi dễ dàng duyệt qua các thực thể mà không cần viết nhiều SQL. Các tính năng di chuyển sẽ tốt đẹp trong tương lai. Mặt khác, trong môi trường tài nguyên hạn chế (iPhone), tôi lo lắng rằng một cơ sở dữ liệu được tạo tự động sẽ bị cồng kềnh với siêu dữ liệu, các mối quan hệ nghịch đảo không cần thiết, các kiểu dữ liệu thuộc tính không hiệu quả, v.v.
Tôi có nên đi sâu vào hoặc thận trọng không? .
Cảm ơn câu trả lời của bạn. Tôi chỉ đang viết công cụ dòng lệnh để lấy dữ liệu sqlite ban đầu được nạp vào một db tuân thủ xcdatamodel. Lao động đáng kể có liên quan. Tôi sẽ báo cáo lại về kinh nghiệm của tôi. –
Để theo dõi ví dụ của bạn, tôi nghĩ rằng vấn đề là một yêu cầu tìm nạp sẽ không nằm trong thực thể Word, nhưng trên thực thể textTable. (Ví dụ giả sử textTable chứa email và Word chứa tất cả các từ trong tất cả các trường email.) Tôi nghĩ điều này làm phức tạp đáng kể vấn đề vì fetchResultsController phải giữ các thực thể textTable được lọc qua vị từ - và một biến vị ngữ ANY hoặc SUBQUERY như vậy chậm. Có thể có cách để thực hiện điều này theo hướng "ngược lại": bằng cách bắt đầu từ phù hợp với từ, theo mối quan hệ nghịch đảo và soạn thảo textTable. Hừm. –
Nếu phần đầu tiên của biến vị ngữ của bạn làm giảm không gian tìm kiếm càng nhiều càng tốt, phần còn lại của biến vị ngữ sẽ thực hiện nhanh hơn, tổng thể, với ít không gian hơn mà nó phải tìm kiếm bên trong. Xem nhanh phần hiệu suất của Hướng dẫn dữ liệu cốt lõi tại đây: http://developer.apple.com/mac/library/documentation/cocoa/conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/ TP40003468 –