معرفی کتابخانه ی مشهور و قدرتمند Lucene.net -- قسمت سوم
  در این مقاله به تشریح نحوه ی بروز رسانی و حذف ایندکس ها در کتابخانه مشهور Lucene.net خواهم پرداخت.
   C#
   ۹۴۶۵
   این مقاله حاوی فایل ضمیمه نمی باشد
   مرتضی صحراگرد
   ۱۳۸۹/۳/۲۸
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

مقدمه:

این مقاله، سومین قسمت از سلسله مقالات معرفی کتابخانه Lucene.net می باشد. برای فراگیری صحیح این مقاله حتما باید قسمت قبلی را فراگرفته باشید.

 در اولین قسمت از مقالات با نحوه ی ایجاد ایندکس ها آشنا شدید. این عمل توسط متد BuildIndexes انجام می شد. در این قسمت این متد را به نحوی تغییر خواهیم داد که بتوانیم اعمال حذف و بروز رسانی ایندکس ها را انجام دهیم.

حذف ایندکس ها:

در قسمت زیر نحوه انجام حذف ایندکس ها را ملاحظه می نمایید.
 

private Lucene.Net.Store.Directory GetNewsIndexDirectory()
{
    // Palce here your own address
    string path = "C:\\IndexesLocation";
    return FSDirectory.GetDirectory(path, false);
}
 
public void DeleteIndex(int newsID)
{
    // Note: You have to  send false as 3th parameter for update and delete purpose 
    IndexWriter indexWriter = new IndexWriter(GetNewsIndexDirectory(), new StandardAnalyzer(), false);
 
    try
    {
        indexWriter.DeleteDocuments(new Term("newsID", newsID.ToString()));
    }
    catch (Exception ex)
    {
        //Log error
        MessageBox.Show("Error! : " + ex.Message);
    }
    finally
    {
        //we need to make sure that we close this!
        if (indexWriter != null)
        {
            //close the index
            indexWriter.Close();
        }
    }
 
}

عملکرد متد GetNewsIndexDirectory تغییر چندانی ننموده است و عملکرد آن برگرداندن محل ذخیره سازی ایندکس ها در قالب کلاس FSDirectory می باشد.(برای اطلاعات بیشتر می توانید به اولین قسمت از مقالات مراجعه نمایید).

عملکرد تابع DeleteIndex نیز بسیار شفاف می باشد. اولین نکته در متد بالا این است که ما هنگام ایجاد شئ IndexWriter، به عنوان پارامتر سوم مقدار false را ارسال نموده ایم در حالیکه در مقاله اول هنگام ایجاد ایندکس ها مقدار true را ارسال نموده بودیم. به یاد داشته باشید که هنگام حذف و بروز رسانی ایندکس ها حتما باید مقدار false ارسال گردد.

 برای حذف کردن یک (یا چندین) ایندکس ابتدا نیاز داریم که مشخص کنیم کدام ایندکس ها باید حذف شوند. ما در متد بالا قصد داریم یک شناسه خبر (newsID) را گرفته و خبر مربوطه را حذف نماییم در نتیجه هنگام فراخوانی متد DeleteDocuments یه شئ از نوع کلاس Termبه آن ارسال نموده ایم و با استفاده از آن  مشخص نموده ایم که قصد داریم عملیات حذف را بر روی ایندکس هایی انجام دهیم که مقدار فیلد newsID آن برابر شناسه خبری است که قصد حذف آن را داریم. در نهایت با فراخوانی متد Commit تغییرات خود را تثبیت می نماییم. (با استفاده از قطعه کد زیر خبری که شناسه آن مشخص نموده ایم در صورت وجود حذف خواهد شد)

indexWriter.DeleteDocuments(new Term("newsID", newsID.ToString()));

اگر قصد داشتیم تمام خبر هایی را که یک نویسنده خاص نوشته بود را حذف کنیم. تنها کافی بود که با استفاده از کلاس Term مشخص کنیم ایندکس هایی را مقدار فیلد WriterID آن برابر مقدار مورد نظر ما باشد. این عمل را در قسمت زیر ملاحظه می نمایید.(WriterID را به طور مثال عدد 3 در نظر گرفته ایم)

indexWriter.DeleteDocuments(new Term("WriterID","3" ));

بروز رسانی ایندکس ها:

در نسخه های ابتدایی از کتابخانه Lucene.net برای بروز رسانی یک ایندکس باید ابتدا آن را حذف نموده و سپس ایندکس جدید را ایجاد می نمودیم. خوشبختانه در نسخه های جدید این کتابخانه این مشکل مرتفع شده است. (جهت دریافت این نسخه از کتبخانه Lucene.net به اولین قسمت از مقالات مراجعه کنید)

در قسمت زیر متدی نوشته ایم که مشخصات مربوط به یک خبر خاص را بروز رسانی می نماید.

public void UpdateIndex(int newsID, int newWriterID, string newTitle, string newBody)
{
    // Note: You have to  send false as 3th parameter for update and delete purpose 
    IndexWriter indexWriter = new IndexWriter(GetNewsIndexDirectory(), new StandardAnalyzer(), false);
 
    try
    {
 
        Document newDoc = new Document();
 
        newDoc.Add(new Field("NewsID",
                          newsID.ToString(),
                          Field.Store.YES, Field.Index.NO, Field.TermVector.NO));
 
        newDoc.Add(new Field("WriterID", newWriterID.ToString(), Field.Store.NO, Field.Index.NOT_ANALYZED,
                          Field.TermVector.NO));
 
        newDoc.Add(new Field("Title", newTitle, Field.Store.YES, Field.Index.ANALYZED,
                          Field.TermVector.NO));
 
        newDoc.Add(new Field("Body", newBody, Field.Store.NO, Field.Index.ANALYZED,
                          Field.TermVector.NO));
 
        indexWriter.UpdateDocument(new Term("NewsID", newsID.ToString()), newDoc);
        indexWriter.Commit();
    }
    catch (Exception ex)
    {
        //Log error
        MessageBox.Show("Error! : " + ex.Message);
    }
    finally
    {
        //we need to make sure that we close this!
        if (indexWriter != null)
        {
            //close the index
            indexWriter.Close();
        }
    }
}

عملکرد متد فوق نیز کاملا شفاف می باشد. ابتدا یک شئ از نوع کلاس Document را با استفاده از مقادیر جدید ایجاد نموده ایم (بدیهی است که شناسه newsID تغییری ننموده است).

در متد UpdateDocument با استفاده از پارامتر اول مشخص نموده ایم که قصد داریم چه خبری را بروز رسانی نماییم و در پارامتر دوم شئ جدیدی که ایجاد نموده ایم را ارسال نموده ایم. سپس با فراخوانی متد Commit تغییرات خود را تثبیت نموده ایم.

ادامه مقالات: