Lucene.Net何时重新索引我的datatbase

时间:2014-08-01 06:38:38

标签: c# asp.net-mvc-3 indexing lucene.net

我在我的电子商务应用程序(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或类似的东西。

1 个答案:

答案 0 :(得分:2)

使用循环,但仅限更新的产品!

如果您的数据库中有最后一个修改时间戳,请使用它来仅获取自上次索引作业以来更新的产品。
另一种方法是在数据库中添加“索引状态”字段。插入或修改产品时(通过批量更新或其他方式),此平面设置为0.当索引作业运行时,在循环中可以将此标志设置为1。 然后,您的索引作业只需要在标志设置为0的所有产品上运行。

别忘了在lucene中你无法真正更新索引:你要删除文档,然后重新添加它。因此,在lucene中,您需要具有产品唯一标识符的字段,以便您可以使用此字段检索文档(通过术语查询搜索),然后将其删除。

另一个提示:p.GetType().GetProperties()使用反射并减慢过程 如果您的所有产品都具有相同的类型,请创建一次PropertyInfo列表(在循环外),以便您只使用一次反射。在循环中重用它。