2010-07-20 34 views
13

Tôi đang làm việc trên Dự án GAE Django nơi tôi phải triển khai chức năng tìm kiếm, tôi đã viết một truy vấn và nó tìm nạp dữ liệu theo từ khóa tìm kiếm.Làm cách nào để tạo truy vấn bộ lọc phân biệt chữ hoa chữ thường với Google App Engine?

portfolio = Portfolio.all().filter('full_name >=',key).filter('full_name <',unicode(key) + u'\ufffd') 

Vấn đề với truy vấn này là phân biệt chữ hoa chữ thường.

Có cách nào để tôi có thể làm việc đó, mà không phụ thuộc vào trường hợp của từ khóa không?

Vui lòng đề xuất.

Xin cảm ơn trước.

Trả lời

20

Bạn cần lưu trữ các phiên bản đã chuẩn hóa của dữ liệu vào thời gian ghi, sau đó sử dụng cùng một chuẩn hóa để tìm kiếm.

Lưu trữ dữ liệu hoặc tất cả chữ hoa hoặc chữ thường, tùy ý xóa dấu câu và thay đổi tất cả khoảng trắng thành một khoảng trắng và có thể chuyển đổi các ký tự không phải ASCII thành một số biểu diễn ASCII hợp lý (dĩ nhiên, phức tạp hơn âm thanh).

+0

Cảm ơn bạn trả lời Wooble. Nhưng dự án là một dự án bảo trì và do đó đã có rất nhiều dữ liệu đang được sử dụng bởi rất nhiều trang. Việc thực hiện thay đổi đối với dữ liệu ngay bây giờ sẽ yêu cầu một lượng công sức lớn tức là thực hiện thay đổi cho tất cả các chế độ xem nơi dữ liệu đang được hiển thị. Không có cách nào để làm cho nó hoạt động với cấu trúc hiện tại? –

+3

Bạn sẽ không nhất thiết phải thay đổi tất cả các khung nhìn, v.v. Chỉ cần thêm một trường có tên là foo_uppercase, và có nhiệm vụ đi qua tất cả các thực thể của bạn 1000 tại một thời điểm hoặc một cái gì đó và điền vào trường. –

+0

@Jason cảm ơn câu trả lời của bạn. Nhưng ngay cả sau đó, nó sẽ yêu cầu thay đổi tất cả các giá trị kho dữ liệu hiện có cho thuộc tính này được thay đổi bằng chữ thường hoặc chữ hoa? –

1

Một giải pháp thay thế cho vấn đề này - nơi tập hợp dữ liệu có quy mô nhỏ - là để lọc các kết quả trong python sau khi bạn đã gọi họ từ kho dữ liệu:

for each_item in list_of_results: 
    if each_item.name.lower().rfind(your_search_term) != -1: 
     #Your results action 
Các vấn đề liên quan