2010-09-14 24 views

Trả lời

5

Nếu bạn biết loại dữ liệu được lưu trữ trong trường của mình, bạn có thể thử truy vấn phạm vi. Ví dụ: nếu trường của bạn chứa dữ liệu chuỗi, truy vấn như field:[a* TO z*] sẽ trả về tất cả tài liệu có giá trị chuỗi trong trường đó.

+0

này nên làm việc. Nó sẽ phức tạp hơn một chút trong trường hợp trường có giá trị bắt đầu bằng số hoặc chữ hoa. Nên dễ dàng thực hiện với truy vấn OR. –

+0

Điểm tốt! Nhưng nếu nó bắt đầu với một vốn, một phạm vi bắt đầu với một * nên bắt nó bởi vì javadoc của TermRangeQuery nói rằng nó sử dụng String.compareTo để xác định xem một chuỗi là một phần của phạm vi. –

+0

Điều này có vẻ tốt. Bạn không chắc chắn về việc bắt các bản ghi bắt đầu bằng các con số, nhưng đây là một khởi đầu tốt. Cảm ơn! –

3

tôi đã thực hiện một số thử nghiệm, và có vẻ như cách đơn giản nhất để đạt được điều này là để tạo ra một QueryParser và gọi SetAllowLeadingWildcard(true) và tìm kiếm field:* như vậy:

var qp = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, field, analyzer); 
qp.SetAllowLeadingWildcard(true); 
var query = qp.Parse("*")); 

(Lưu ý tôi đang thiết lập mặc định trường của QueryParser đến field trong hàm tạo của nó, do đó tìm kiếm chỉ "*" trong Parse()).

tôi không thể xác minh cho hiệu quả như thế nào phương pháp này là qua các phương pháp khác, nhưng là phương pháp đơn giản nhất tôi có thể tìm thấy, tôi mong chờ nó phải có ít nhất là hiệu quả như field:[* TO *], và nó tránh được việc phải làm những việc hackish như field:[0* TO z*] , có thể không tính đến tất cả các giá trị có thể, chẳng hạn như các giá trị bắt đầu bằng các ký tự không phải chữ và số.

1

Một giải pháp khác là sử dụng một ConstantScoreQuery với một FieldValueFilter

new ConstantScoreQuery(new FieldValueFilter("field")) 
Các vấn đề liên quan