Lucene.何时重新索引我的数据库

本文关键字:我的 数据库 索引 何时重 新索引 Lucene | 更新日期: 2023-09-27 18:15:59

我正在实现Lucene。Net在我的电子商务应用程序(Asp。Net Mvc3, Sql server 2008),拥有庞大的数据库。索引产品是一项非常繁重的工作。虽然索引它一次对我来说是ok的。

现在当我更新,创建,删除特定产品的任何产品索引时,应该相应地更新。

我还通过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或类似的东西来索引文档

Lucene.何时重新索引我的数据库

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

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

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

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