2016-02-15 2 views
0

Я использую lucene.net для поиска деталей счета продукта. полностью в этом 500k (документе) записи & 6 полей, добавленных в созданные документы.lucene.net медленный при поиске только 500k записей

Я использую версию lucene.net 3.0.3.0.

public DataSet Search(string criterion, string term) 
{ 

string indexPath = System.Configuration.ConfigurationManager.AppSettings["LuceneIndexPathBillSearch"]; 
      Lucene.Net.Store.Directory directory = FSDirectory.Open(new DirectoryInfo(indexPath)); 
      Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); 

      IndexReader indexReader = IndexReader.Open(directory, true); 
      Searcher searcher = new IndexSearcher(indexReader); 
      var queryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, criterion, analyzer); 

      queryParser.AllowLeadingWildcard = true; 

      var query = queryParser.Parse(term.ToLower() + "*"); 
      var sort = new Sort(new SortField(term, SortField.STRING, false)); 

      TopDocs resultDocs = searcher.Search(query, null, indexReader.MaxDoc, sort); 
      var topDocs = resultDocs.ScoreDocs; 

      DataSet Product= new DataSet(); 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("BillId"); 
      dt.Columns.Add("BillNo"); 
      dt.Columns.Add("BillDate"); 
      dt.Columns.Add("BillUniqueNo"); 
      dt.Columns.Add("ProductName"); 
      dt.Columns.Add("ProductCode"); 
      dt.Columns.Add("Status"); 
      dt.Columns.Add("IsServiceOrder"); 
      DataRow row = null; 
      foreach (var hit in topDocs) 
      { 
       var documentFromSerach = searcher.Doc(hit.Doc); 
       row = dt.NewRow(); 
       row["BillId"] = documentFromSerach.Get("BillId"); 
       row["BillNo"] = documentFromSerach.Get("BillNo"); 
       row["BillDate"] = documentFromSerach.Get("BillDate"); 
       row["BillUniqueNo"] = documentFromSerach.Get("BillUniqueNo"); 
       row["ProductName"] = documentFromSerach.Get("ProductName"); 
       row["ProductCode"] = documentFromSerach.Get("ProductCode"); 
       row["status"] = documentFromSerach.Get("status"); 
       row["IsServiceOrder"] = documentFromSerach.Get("IsServiceOrder"); 
       dt.Rows.Add(row); 
      } 
      Product.Tables.Add(dt); 

      return Product; 
    } 

Что я здесь делаю неправильно? почему занимает от 10 до 15 секунд поиск текста из созданного индекса?

ответ

0

Возможно, проблема заключается в том, что вы создаете IndexReader для каждого запроса. Lucene, вероятно, тратит время на кеширование значений (среди прочего), которое стоит вам времени.

Это эквивалент остановки и запуска сервера базы данных для каждого запроса.

Если ваш индекс «стабильный», то просто держитесь за экземпляр искателя.

Если нет, и вы делаете обновления, которые хотите просмотреть. Затем сохраните и экземпляр IndexWriter. Делайте все обновления через это (это потокобезопасно). Затем создайте своего поисковика с помощью searcher = new IndexSearcher(writer.GetReader()). Это гарантирует, что читатель/поисковик всегда обновляется.

Нижняя строка ... не создавайте/не воссоздавайте много экземпляров IW, IR, IS в вашем приложении. Храните один экземпляр и делайте все через это.

Существует еще много нюансов для перфорации и латентности и т. Д.