Hi. I noticed that after the upgrade from Lucene8.5.x to Lucene >=8.6,
 search became slower(example TopScoreDocCollector became 20-30% slower,
from ElasticSearch - 50%).

While testing, I realized that it happened after LUCENE-9257(commit
e7a61ea). Bug or feature? Can add settings for isOffHeep? To make the
developer explicitly make this choice

Added a file that shows a simple demo that the search is slow
Need to run on commit e7a61ea and 90aced5, you will notice how the speed
drops to 30%
package org.apache.lucene.demo;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.store.NIOFSDirectory;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.Directory;

import org.apache.lucene.index.SegmentReader;
import org.apache.lucene.index.SegmentCommitInfo;
import org.apache.lucene.index.LeafReaderContext;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;


public class SpeedLucene {
  public static void main(String[] args) throws IOException, ParseException {
    System.out.println("-Start-");

    // 0. create the analyzer
    StandardAnalyzer analyzer = new StandardAnalyzer();

    // 1. create the index
    boolean isDeleteDir = deleteDirectory(new File("fs_test"));
    Directory index = new NIOFSDirectory(Paths.get("fs_test/"));
    IndexWriterConfig config = new IndexWriterConfig(analyzer);
    // config.setRAMBufferSizeMB(16);


    IndexWriter w = new IndexWriter(index, config);
    for (int x = 0; x < 1000000; x++) {
      addDoc(w, "Lucene in Action " + x, "1" + x);
    }
    w.close();

    // 2. query
    Query q = new QueryParser("title", analyzer).parse("lucene");

    // 3. search
    int hitsPerPage = 10;
    IndexReader reader = DirectoryReader.open(index);
    IndexSearcher searcher = new IndexSearcher(reader);

    // 3.1 segment info
    int numDocs = 0;
    int numDeletedDocs = 0;
    long sizeInBytes = 0;
    for (LeafReaderContext readerContext : reader.leaves()) {
      final SegmentReader segmentReader = (SegmentReader) readerContext.reader();
      SegmentCommitInfo info = segmentReader.getSegmentInfo();
      numDocs += readerContext.reader().numDocs();
      numDeletedDocs += readerContext.reader().numDeletedDocs();

      long ramBytesUsed = segmentReader.getPostingsReader().ramBytesUsed();

      System.out.println("Codec" + info.info.getCodec());
      System.out.println("Postings ram " + ramBytesUsed + " byte");
      if (segmentReader.getNormsReader() != null) {
        ramBytesUsed += segmentReader.getNormsReader().ramBytesUsed();
        System.out.println("Norms ram " + segmentReader.getNormsReader().ramBytesUsed() + " byte");
      }

      if (segmentReader.getDocValuesReader() != null) {
        ramBytesUsed += segmentReader.getDocValuesReader().ramBytesUsed();
        System.out.println("DocValues ram " + segmentReader.getDocValuesReader().ramBytesUsed() + " byte");
      }

      if (segmentReader.getFieldsReader() != null) {
        ramBytesUsed += segmentReader.getFieldsReader().ramBytesUsed();
        System.out.println("Fields ram " + segmentReader.getFieldsReader().ramBytesUsed() + " byte");
      }

      if (segmentReader.getTermVectorsReader() != null) {
        ramBytesUsed += segmentReader.getTermVectorsReader().ramBytesUsed();
        System.out.println("TermVectors ram " + segmentReader.getTermVectorsReader().ramBytesUsed() + " byte");
      }

      if (segmentReader.getPointsReader() != null) {
        ramBytesUsed += segmentReader.getPointsReader().ramBytesUsed();
        System.out.println("Points ram " + segmentReader.getPointsReader().ramBytesUsed() + " byte");
      }
      System.out.println("---");

      sizeInBytes += ramBytesUsed;
    }
    System.out.println("sizeInBytes " + sizeInBytes + " ");

    TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, hitsPerPage);
    long startTime = System.currentTimeMillis();
    for (int x = 0; x < 100000; x++) {
      searcher.search(q, collector);
    }
    System.out.println("Time searcher " + (System.currentTimeMillis() - startTime));
    ScoreDoc[] hits = collector.topDocs().scoreDocs;

    // 4. display results
    startTime = System.currentTimeMillis();
    for (int x = 0; x < 100000; x++) {

      for (int i = 0; i < hits.length; ++i) {
        int docId = hits[i].doc;
        Document d = searcher.doc(docId);
        //System.out.println((i + 1) + ". " + d.get("isbn") + "\t" + d.get("title"));
      }

    }
    System.out.println("Time get doc " + (System.currentTimeMillis() - startTime));
    reader.close();
  }

  private static void addDoc(IndexWriter w, String title, String isbn) throws IOException {
    Document doc = new Document();
    doc.add(new TextField("title", title, Field.Store.YES));
    doc.add(new StringField("isbn", isbn, Field.Store.YES));
    w.addDocument(doc);
  }

  private static boolean deleteDirectory(File directoryToBeDeleted) {
    File[] allContents = directoryToBeDeleted.listFiles();
    if (allContents != null) {
      for (File file : allContents) {
        deleteDirectory(file);
      }
    }
    return directoryToBeDeleted.delete();
  }

}
---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
For additional commands, e-mail: java-user-h...@lucene.apache.org

Reply via email to