我在我的电子商务应用程序(Asp.Net Mvc3,Sql server 2008)中实现了Lucene.Net,它拥有庞大的数据库。所以索引产品的运营非常繁重。虽然单次索引它对我来说没问题。
现在,当我更新,创建,删除特定产品的任何产品索引时,都应该相应地更新。
此外,我还通过Excel工作表实现了产品的批量更新。因此,通过此操作插入,更新或删除了更多数量的产品。我应该选择哪种方法来重新索引我的产品?
由于大多数产品没有变化,因此重新索引所有产品并增加服务器负载可能不是一个好主意。
我的产品索引代码是
foreach (var p in products)
{
//Create the Document object
// object temp = p;
Document doc = new Document();
var properties = p.GetType().GetProperties();
foreach (PropertyInfo propertyInfo in properties)
{
//Populate the document with the column name and value from our query
var value = propertyInfo.GetValue(p, null);
doc.Add(new Field(propertyInfo.Name, value == null ? "" : value.ToString(), Field.Store.YES, Field.Index.ANALYZED));
}
// Write the Document to the catalog
indexWriter.AddDocument(doc);
}
任何人都知道解决方法。有没有办法索引文档而不使用foreach或类似的东西。
答案 0 :(得分:2)
使用循环,但仅限更新的产品!
如果您的数据库中有最后一个修改时间戳,请使用它来仅获取自上次索引作业以来更新的产品。
另一种方法是在数据库中添加“索引状态”字段。插入或修改产品时(通过批量更新或其他方式),此平面设置为0.当索引作业运行时,在循环中可以将此标志设置为1。
然后,您的索引作业只需要在标志设置为0的所有产品上运行。
别忘了在lucene中你无法真正更新索引:你要删除文档,然后重新添加它。因此,在lucene中,您需要具有产品唯一标识符的字段,以便您可以使用此字段检索文档(通过术语查询搜索),然后将其删除。
另一个提示:p.GetType().GetProperties()
使用反射并减慢过程
如果您的所有产品都具有相同的类型,请创建一次PropertyInfo
列表(在循环外),以便您只使用一次反射。在循环中重用它。