21

Tôi đang sử dụng Lucene.Net cho chỉ mục và tìm kiếm tài liệu, và tôi đang sử dụng đoạn mã sau để tạo hoặc mở một chỉ số nếu có:Làm thế nào để xác định nếu một Lucene.Net Index tồn tại trong một thư mục?

IndexWriter writer = new IndexWriter(@"C:\index", new StandardAnalyzer(), !IndexExists); 

... 

private bool IndexExists 
{ 
    get 
    { 
     return ?? 
    } 
} 

Bây giờ, làm thế nào có thể thực hiện IndexExists một cách đơn giản? Tôi không cần bất kỳ ngoại lệ nào để ném.

Trả lời

37

Phương pháp tĩnh IndexReader.IndexExists (đường dẫn chuỗi) (hoặc một trong các quá tải của nó) có vẻ khá phù hợp.

3

Bạn chỉ có thể sử dụng hàm tạo không tham số boolean. Điều đó sẽ mở ra một chỉ mục hiện có nếu có một chỉ mục hoặc tạo một chỉ mục mới nếu nó không tồn tại.

liên kết tài liệu Java (tương tự cho Lucene.Net): http://lucene.apache.org/java/2_3_1/api/org/apache/lucene/index/IndexWriter.html#IndexWriter(org.apache.lucene.store.Directory, org.apache.lucene.analysis.Analyzer)

+0

Lucene.net không có quá tải này. – Marek

+1

Phiên bản nào của Lucene.Net thiếu quá tải? Nó có trong 2.4. –

+0

Tôi đang sử dụng Lucene "thẳng Java". 'IndexWriter' trong 4.10 + chỉ có một hàm tạo. Nhưng tôi không hiểu làm thế nào bạn có thể có được những gì người hỏi muốn từ giải pháp của bạn: tìm hiểu có hay không có một chỉ số đã có. –

0

Tôi cố gắng tìm anwser này quá mà không thành công và đây là cách tôi sử dụng trong mã của tôi:

IndexExists bool tin { get { trả về IndexDirectory.FileExists ("segments.gen"); } }

+0

Thông minh ... và có thể là cách tốt nhất hiện tại (xem câu trả lời của tôi: 4.10. + Đã thay đổi đặc tả của 'DirectoryReader.indexExists()' kể từ 4.0. +). Nhưng tất nhiên, như tôi chắc chắn bạn đã biết, giải pháp của bạn rất dễ bị tổn thương đối với các thay đổi của phiên bản. Mỗi phiên bản mới sẽ phải được kiểm tra! –

4

Trong < 4.0 là IndexReader.indexExists(org.apache.lucene.store.Directory)

nhập> 4.0 là DirectoryReader.indexExists(org.apache.lucene.store.Directory)

0

Rất tiếc!

Đây là "thẳng Java" Lucene, nhưng nó cũng có thể áp dụng cho các giống khác.

Trong Lucene 4.0.0 API cho DirectoryReader.indexExists() nói

trả về true nếu một chỉ số tồn tại ở thư mục chỉ định.

Nhưng trong Lucene 4.10.2 API cho DirectoryReader.indexExists() nói

trả về true nếu một chỉ số có khả năng tồn tại ở thư mục chỉ định. Lưu ý rằng nếu một chỉ số tham nhũng tồn tại, hoặc nếu một chỉ số trong quá trình cam kết

... vâng, nó phá vỡ ra giữa câu. NB Tôi đã biên dịch Javadoc trực tiếp từ nguồn, nhưng cùng một cụm từ chưa hoàn thành có thể được nhìn thấy trong API trực tuyến. Không chỉ vậy, nhưng tôi đã nhìn vào API Lucene 6.0.0, và nó giống hệt nhau.

Các "Thu nhập" Tuy nhiên cụm từ là:

đúng nếu một chỉ số tồn tại; false else

... nhưng hiện tại tôi tin rằng thư mục trống sẽ đôi khi (?) trả lại true (từ thử nghiệm đơn vị của tôi). Dù sao, tôi sẽ không tin nó.

Nếu bạn tạo IndexReader trên một thư mục trống, có vẻ như tất cả các phương thức của nó sẽ trả lại mà không phải ném ngoại lệ. Bạn có thể đi indexReader.numDocs() và điều này sẽ trả lại 0, nhưng điều đó không chứng minh rằng không có chỉ mục ở đó, chỉ có không có Document s. Tùy thuộc vào yêu cầu của bạn có thể là đủ, tất nhiên.

Tương tự, bạn có thể tạo IndexSearcher từ số IndexReader như vậy và bạn có thể tạo IndexWriter. Không ai trong số này sẽ có bất kỳ vấn đề rõ ràng với một thư mục trống. GIẢI PHÁP

TỐT HƠN:

try { 
     directoryReader = DirectoryReader.open(fsDir); 
    } catch (org.apache.lucene.index.IndexNotFoundException e) { 
     ... 
    } 

này xuất hiện, như xa như tôi có thể nói, là đáng tin cậy.

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