6 Mart 2018 Salı

Lucene IndexSearcher Sınıfları

Giriş
IndexSearcher nesnesinden Document nesnesini bulmak biraz karışık.

Query nesnesi IndexSearcher'a verilir ve search() metodu çağrılır. Dönen sonuç TopDocs nesnesidir.
Bu nesnenin scoreDocs alanı ScoreDoc dizisidir. Her ScoreDoc için yine searcher nesnesinin doc() metodu çağrılır ve Document nesnesi elde edilir. Şöyle yaparız.
private static void queryDocs(RAMDirectory ramDir, Analyzer analyzer) 
        throws IOException, ParseException {
  // IndexReader maintains access to the index
  IndexReader reader = DirectoryReader.open(ramDir);

  // IndexSearcher handles searching of an IndexReader
  IndexSearcher searcher = new IndexSearcher(reader);

  // Setup a query
  QueryParser parser = new QueryParser("body", analyzer);
  Query query = parser.parse("hey earth");

  // Search the index
  TopDocs foundDocs = searcher.search(query, 10);
  System.out.println("Total Hits: " + foundDocs.totalHits);

  for (ScoreDoc scoreDoc : foundDocs.scoreDocs) {
    // Get the doc from the index by id
    Document document = searcher.doc(scoreDoc.doc);
    System.out.println("Name: " + document.get("name") 
              + " - Body: " + document.get("body") 
              + " - Score: " + scoreDoc.score);
  }

  // Close down the reader
  reader.close();
}
IndexReader Sınıfı
Giriş
Şu satırı dahil ederiz.
import org.apache.lucene.index.IndexReader;
constructor
Şöyle yaparız.
Directory directory = new RAMDirectory();
...
IndexReader reader = DirectoryReader.open(directory);
getTermVector metodu
Şöyle yaparız.
for (int i = 0;  i < reader.maxDoc(); i++) {
  Terms terms = reader.getTermVector(i, "country_text");
}
maxDoc metodu
Şöyle yaparız.
for (int i = 0;  i < reader.maxDoc(); i++) {
  Document doc = reader.document(i);
  ...
}
IndexSearcher Sınıfı
Giriş
Şu satırı dahil ederiz.
import org.apache.lucene.search.IndexSearcher;
Açıklaması şöyle.
IndexSearcher instances are completely thread safe, meaning multiple threads can call any of its methods, concurrently. If your application requires external synchronization, you should not synchronize on the IndexSearcher instance; use your own (non-Lucene) objects instead.
constructor - IndexReader
Şöyle yaparız.
IndexReader reader = IndexReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
constructor - DirectoryReader
Şöyle yaparız.
Directory directory = new RAMDirectory();
...
// Now search the index:
DirectoryReader directoryReader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(directoryReader);
getIndexReader metodu
constructor içinde verilen nesneyi döner.

search metodu - Query + int
TopDocs nesnesi döner.
Örnek
Şöyle yaparız.
// Search the index
TopDocs foundDocs = searcher.search(query, 10);
Örnek
Şöyle yaparız.
Query query = ...;
int hits = searcher.search(query, 1).totalHits;
Örnek
Şöyle yaparız.
Query query = ...;
ScoreDoc[] hits = searcher.search(query, null, 1000).scoreDocs;

TopDocs Sınıfı
Giriş
Şu satırı dahil ederiz.
import org.apache.lucene.search.TopDocs;
scoreDocs Alanı
Şöyle yaparız.
// Search the index
TopDocs foundDocs = searcher.search(query, 10);
System.out.println("Total Hits: " + foundDocs.totalHits);

for (ScoreDoc scoreDoc : foundDocs.scoreDocs) {
  // Get the doc from the index by id
  Document document = searcher.doc(scoreDoc.doc);
  System.out.println("Name: " + document.get("name") 
    + " - Body: " + document.get("body") 
    + " - Score: " + scoreDoc.score);
}
totalHits Alanı
Şöyle yaparız.
// Search the index
TopDocs foundDocs = searcher.search(query, 10);
System.out.println("Total Hits: " + foundDocs.totalHits);

Hiç yorum yok:

Yorum Gönder