lucene.net只搜索500k记录时速度慢

时间:2016-02-15 14:24:02

标签: c# lucene.net

我正在使用lucene.net搜索产品帐单详细信息。完全在这500k(文件)记录和&已将6个字段添加到创建的文档中。

我使用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秒从创建的索引中搜索文本?

1 个答案:

答案 0 :(得分:0)

问题可能是您正在为每个查询创建一个IndexReader。 Lucene可能花时间缓存术语值(以及其他因素),这会花费你的时间。

这相当于为每个查询停止和启动数据库服务器。

如果您的指数是"稳定"然后抓住搜索者的实例。

如果没有,您执行希望搜索查看的更新。然后保留IndexWriter的实例。通过它做所有更新(它的线程安全)。然后使用searcher = new IndexSearcher(writer.GetReader())创建搜索者。这将确保读者/搜索者始终保持最新状态。

底线...不要在您的应用中创建/重新创建IW,IR,IS的许多实例。保留一个实例并完成所有工作。

对于perf / latency等,这还有很多细微差别。