我正在使用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秒从创建的索引中搜索文本?
答案 0 :(得分:0)
问题可能是您正在为每个查询创建一个IndexReader。 Lucene可能花时间缓存术语值(以及其他因素),这会花费你的时间。
这相当于为每个查询停止和启动数据库服务器。
如果您的指数是"稳定"然后抓住搜索者的实例。
如果没有,您执行希望搜索查看的更新。然后保留IndexWriter的实例。通过它做所有更新(它的线程安全)。然后使用searcher = new IndexSearcher(writer.GetReader())
创建搜索者。这将确保读者/搜索者始终保持最新状态。
底线...不要在您的应用中创建/重新创建IW,IR,IS的许多实例。保留一个实例并完成所有工作。
对于perf / latency等,这还有很多细微差别。