【问题标题】:Lucene.Net when to reindex my datatbaseLucene.Net 何时重新索引我的数据库
【发布时间】:2014-08-01 06:38:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你能用一些代码描述,我怎样才能删除特定产品的文档并再次索引它,即附加它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2014-10-25
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多