2013-03-08 26 views
12

Tôi đang cố cập nhật mã của mình từ Lucene 3.4 đến 4.1. Tôi đã tìm ra những thay đổi ngoại trừ một thay đổi. Tôi có mã mà cần phải lặp trên tất cả các giá trị thuật ngữ cho một trường. Trong Lucene 3.1 có một phương thức IndexReader # terms() cung cấp một TermEnum, mà tôi có thể lặp lại. Điều này dường như đã thay đổi cho Lucene 4.1 và thậm chí sau vài giờ tìm kiếm trong tài liệu, tôi không thể tìm ra cách. Có thể ai đó xin vui lòng chỉ cho tôi đi đúng hướng?Cách nhận tất cả các điều khoản cho trường Lucene trong Lucene 4

Cảm ơn.

+0

Tôi chỉ chuyển một phần câu trả lời cho các câu trả lời bạn đánh dấu vì nó có thể gây nhầm lẫn và không trực quan để tìm kiếm và tìm câu trả lời trong việc xây dựng câu hỏi. – MahNas92

Trả lời

2

Hãy làm theo Lucene 4 Migration guide ::

Làm thế nào bạn có được những enums đã thay đổi. Điểm vào chính là lớp Fields. Nếu bạn biết người đọc của bạn là một người đọc phân khúc duy nhất, làm này:

Fields fields = reader.Fields(); 
if (fields != null) { 
    ... 
} 

Nếu người đọc có thể là nhiều giai đoạn, bạn phải làm điều này:

Fields fields = MultiFields.getFields(reader); 
if (fields != null) { 
    ... 
} 

Các fields có thể null (ví dụ nếu người đọc không có trường nào).

Lưu ý rằng cách tiếp cận MultiFields đòi hỏi phải có hiệu suất đạt trên MultiReaders vì phải hợp nhất các điều khoản/tài liệu/vị trí khi đang di chuyển. Thay vào đó, thay vào đó, bạn có thể sử dụng số để có được trình đọc tuần tự (sử dụng oal.util.ReaderUtil) và sau đó tự mình đọc từng bước, nếu bạn có thể (đây là cách Lucene thúc đẩy tìm kiếm).

Nếu bạn vượt qua SegmentReader đến MultiFields.fields, nó sẽ chỉ đơn giản là trả về reader.fields(), do đó không có hiệu suất nào xảy ra trong trường hợp đó.

Một khi bạn có một Fields không null bạn có thể làm điều này:

Terms terms = fields.terms("field"); 
if (terms != null) { 
    ... 
} 

Các terms có thể null (ví dụ: nếu trường không tồn tại).

Một khi bạn có một phi null thuật ngữ mà bạn có thể nhận được một enum như thế này:

TermsEnum termsEnum = terms.iterator(); 

Các trở TermsEnum sẽ không được null.

Bạn có thể sau đó .next() qua TermsEnum

+11

Tuyệt vời để đề cập đến hướng dẫn di chuyển, nhưng tôi nghĩ câu trả lời của bạn sẽ hữu ích hơn nhiều nếu bạn có thể đăng ở đây phần có liên quan đến câu hỏi và những gì bạn đề xuất làm. – javanna

+2

Tôi vừa thêm phần liên quan vào câu hỏi của mình ở trên. – ali

+0

hmm, xấu của tôi, tôi sẽ tính đến điều đó từ bây giờ .. – phani

Các vấn đề liên quan