Lucene.net - 索引期间崩溃

时间:2012-08-22 00:10:35

标签: lucene lucene.net luke

我的索引器使用Lucene,在写入大小约为16GB的索引文件后,似乎在索引操作期间崩溃。

写入控制台的堆栈跟踪重复三次,原因我不知道。为简洁起见,我只提供了重复的单个部分。这是Lucene写给conolse的堆栈跟踪:

Lucene.Net.Index.MergePolicy+MergeException: Exception of type 'Lucene.Net.Index.MergePolicy+MergeException' was thrown. --->

System.IO.FileNotFoundException: Could not find file 'PATH_TO_MY_INDEX_DIRECTORY\_xx.cfs'.

File name: 'PATH_TO_MY_INDEX_DIRECTORY\_xx.cfs'
at Lucene.Net.Index.IndexWriter.HandleMergeException(Exception t, OneMerge merge)
at Lucene.Net.Index.IndexWriter.Merge(OneMerge merge)
at Lucene.Net.Index.ConcurrentMergeScheduler.MergeThread.Run()
--- End of inner exception stack trace ---
at Lucene.Net.Index.ConcurrentMergeScheduler.HandleMergeException(Exception exc)
at Lucene.Net.Index.ConcurrentMergeScheduler.MergeThread.Run()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

当我用Luke的Java版本打开生成的日志时,索引被删除(可能是因为它已损坏,例如“write.lock”文件仍然存在),尽管这可能是Luke的错误或配置错误。 / p>

创建这个索引需要大约36个小时,而且我不想第三次再次这样做(这不是第一次发生)。

我不知道造成这种情况的原因。我该怎么办?

我正在使用Lucene.net 2.9.2,因为它是为.NET 3.5构建的最后一个版本。

3 个答案:

答案 0 :(得分:4)

我意识到这是因为在没有调用Commit的情况下过多地写入索引。在编写了大约10MB的数据后,我修改了我的代码来调用Commit。我没有异常 - 当它崩溃时它意味着我不需要重建整个36GB索引,只需要重建10MB。

答案 1 :(得分:1)

需要一段时间才能找到,但事实证明(在我的情况下)是由本地硬盘已满。更有用的异常消息会有所帮助。

答案 2 :(得分:0)

是的,聚会非常晚,但我有同样的问题作为这个例外的一部分:

    if ( ! defined( 'ABSPATH' ) ) {
        exit; 
    }


    add_filter("product_type_options", "woo_bookable_product");


    function woo_bookable_product($product_type_options)
    {

        $product_type_options["Bookable"] = array(
            "id"            => "_bookable",
            "wrapper_class" => "show_if_simple",
            "label"         => "Bookable",
            "description"   => "Book Your Product",
            "default"       => "yes",
        );

        return $product_type_options;

    }

    add_action("save_post_product",'woo_save_bookable_data', 10, 3); 


    function woo_save_bookable_data($post_ID, $product, $update)
    {
        $meta_value = $_POST["_bookable"] ? 'yes' : 'no';

        update_post_meta($product->ID, "_bookable" ,$meta_value);

    }


    function woo_bookable_scripts()
    {
        wp_enqueue_script('load_book', plugin_dir_url( __FILE__ ).'js/load_book.js',array('jquery'));
        wp_localize_script('load_book','ajax_object',array('ajax_url'=>admin_url('admin-ajax.php')));

    }
    add_action('wp_enqueue_scripts','woo_bookable_scripts');

    add_action('wp_ajax_woo_bookable_shortcode', 'woo_bookable_shortcode');
    add_action('wp_ajax_nopriv_woo_bookable_shortcode', 'woo_bookable_shortcode');

    function woo_bookable_shortcode()
    {
        $Data = '';
    $query = new WP_Query(array(
        'post_type' => 'product',
        'meta_key'  => '_bookable'
    ));
    $Data.='<select name="woo_book_id" class="woo_book_pro">
            <option value="0">Bookable Products</option>';


    if($query->have_posts()):while($query->have_posts()):$query->the_post();

    $Data.='<option value="'. get_the_ID() .'">'. get_the_title() .'</option>';

    endwhile;endif;

    $Data.='</select>';

    $Data.= woo_bookable_add_to_cart();

echo $Data;
    }
    add_shortcode('bookable','woo_bookable_shortcode');

我通过删除所有索引并重建它们来解决这个问题。