21

Używam Lucene.Net do indeksowania i wyszukiwania dokumentów i używam następujący kod, aby utworzyć lub otworzyć indeksu jeśli istnieje:Jak rozpoznać, czy indeks Lucene.Net istnieje w folderze?

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

... 

private bool IndexExists 
{ 
    get 
    { 
     return ?? 
    } 
} 

Teraz, w jaki sposób można wdrożyć IndexExists w prosty sposób? Nie potrzebuję żadnych wyjątków do rzucenia.

Odpowiedz

37

Metoda statyczna IndexReader.IndexExists (ciąg znaków) (lub jeden z jej przeciążeń) wydaje się całkiem odpowiedni.

3

Można po prostu użyć konstruktora, który nie przyjmuje parametru boolowskiego. Otworzy istniejący indeks, jeśli taki istnieje, lub utworzy nowy, jeśli nie istnieje.

Link dokumentacja Java (takie same dla 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 nie ma tego przeciążenia. – Marek

+1

W której wersji Lucene.Net brakuje przeciążenia? Jest tam w 2.4. –

+0

Używam Lucene "prostej Javie". 'IndexWriter' w 4.10. + Ma tylko jeden konstruktor. Ale nie rozumiem, w jaki sposób można uzyskać to, czego pytał wnioskodawca od rozwiązania: dowiedzieć się, czy istnieje już tam indeks. –

0

staram się znaleźć to anwser też bez powodzenia, a oto jak kiedyś w moim kodu:

prywatne IndexExists bool {get { return indexDirectory.FileExists ("segment.gen"); } }

+0

Sprytny ... i prawdopodobnie najlepszy obecnie sposób (patrz moja odpowiedź: 4.10. + Zmienił specyfikację 'DirectoryReader.indexExists()' od 4.0. +). Ale oczywiście, ponieważ jestem pewien, że jesteś świadomy, twoje rozwiązanie jest bardzo podatne na zmiany w wersji. Każda nowa wersja będzie musiała zostać sprawdzona! –

4

W < 4.0 jest IndexReader.indexExists(org.apache.lucene.store.Directory)

W> 4.0 jest DirectoryReader.indexExists(org.apache.lucene.store.Directory)

0

Ups!

To jest "prosta Java" Lucene, ale może również odnosić się do innych odmian.

W Lucene 4.0.0 API dla DirectoryReader.indexExists() mówi

Zwraca true, jeśli indeks istnieje w określonym katalogu.

Ale w Lucene 4.10.2 API dla DirectoryReader.indexExists() mówi

Zwraca true, jeśli indeks prawdopodobnie istnieje w określonym katalogu. Zauważ, że jeśli uszkodzony indeks istnieje, czy indeks w procesie popełnienia

... tak, to urywa w pół zdania. NB Skompilowałem mój Javadoc bezpośrednio ze źródła, ale to samo niedokończone wyrażenie można zobaczyć w internetowym API. Nie tylko, ale spojrzałem na Lucene 6.0.0 API, i to jest dokładnie to samo.

W "zwraca" fraza jednakże:

true, jeśli indeks istnieje; false inaczej

... ale obecnie sądzę, że pusty katalog czasami (?) zwróci true (z mojej jednostki testowania). W każdym razie nie ufałbym temu.

Jeśli utworzysz IndexReader w pustym katalogu, okaże się, że wszystkie jego metody zostaną zwrócone bez odrzucania wyjątków. Możesz przejść indexReader.numDocs(), a to zwróci 0, ale to nie dowodzi, że nie ma tam indeksu, tylko że nie ma Document s. Oczywiście w zależności od twoich wymagań.

Podobnie można utworzyć IndexSearcher z takiej IndexReader i można utworzyć IndexWriter. Żadne z nich nie będzie miało żadnego widocznego problemu z pustym katalogiem.

lepsze rozwiązanie: Komunikat ten

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

, o ile mogę powiedzieć, aby być wiarygodne.