بعد بضعة أيام من العمل المزدحم، قمت أخيرًا بإجراء بحث بسيط عن النص الكامل، واسمحوا لي بمراجعة هذه المقالة وتلخيصها
. ما هو موقع Lucene.Net؟ ما الذي يمكن أن تفعله شركة Lucene.Net؟ وسؤال كيف نفعل ذلك؟ أخيرًا، تم تقديم مثال لتطبيق Lucene.Net للبحث عن النص الكامل.
1. ما هو Lucene.Net؟
كان Lucene.net في الأصل مشروعًا مفتوح المصدر ثم تحول بعد ذلك إلى التسويق، وتم إصدار Lucene.net 2.0 أيضًا، ولكن مقابل المال D. يشبه مصير Lucene.net إلى حد ما FreeTextBox، الذي بدأ بإصدار 2.0 بعد الإصدار 1.6. 5. المسار التجاري، 2.0 يوفر نسخة مجانية في شكل DLL، ويجب على إصدار الكود المصدري شراء ترخيص تجاري؛ ومع ذلك، فإنه يترك الكود المصدري للإصدار 1.6.5، ولا يزال بإمكانك رؤية معظم التفاصيل الداخلية ولكن في الإصدار 2.0، لا يكون الدعم الإضافي لمتصفح Mozilla مرئيًا إلا من خلال نصوص HTML وJavaScript النصية التي ينشئها.
Lucene هي واجهة برمجة تطبيقات للفهرسة شائعة الاستخدام في عالم Java. باستخدام الطرق التي توفرها، يمكنك إنشاء فهارس للمواد النصية وتوفير الاسترجاع. (المرجع: NLucene وLucene .NET) NLucene هو أول منفذ .net وإصدار بنمط .net يستخدم اصطلاحات تسمية .net وتصميم مكتبة الفئات. ومع ذلك، ولأسباب تتعلق بالطاقة، أصدر قائد مشروع NLucene الإصدار 1.2beta فقط. بعد ظهور مشروع Lucene.NET، لم تكن هناك خطط جديدة لـ NLucene.
ادعى موقع Lucene.NET في الأصل أنه نسخة محدثة من .net Lucene، وقد اعتمد فقط اقتراحات .net فيما يتعلق بالتسمية. وتميل أهدافه الرئيسية إلى التوافق مع Java Lucene: أحدها هو جعل تنسيق الفهرس متوافقًا يمكن أن يعملوا معًا. الغرض الأول هو أن تكون التسمية متقاربة (مع وجود اختلافات قليلة فقط، مثل الأحرف الكبيرة والصغيرة، وما إلى ذلك)، والغرض هو تسهيل استخدام المطورين للتعليمات البرمجية والمعلومات المتعلقة بـ Java Lucene.
لا أعرف متى تخلى مشروع Lucene.NET عن خطته مفتوحة المصدر وتحول إلى العمل. لقد قام بالفعل بحذف الملفات مفتوحة المصدر على SourceForge. في الوقت نفسه، ظهر مشروع dotLucene على SourceForge احتجاجًا على Lucene.NET، وكاد dotLucene أن يضع كود Lucene.NET سليمًا كنقطة بداية. ( https://sourceforge.net/forum/forum.php?thread_id=1153933&forum_id=408004 ).
بصراحة، Lucene.Net هي مكتبة وظائف استرجاع المعلومات (مكتبة). يمكنك استخدامها لإضافة وظائف الفهرسة والبحث إلى تطبيقك،
ولكن لا يحتاج مستخدمو Lucene إلى معرفة متعمقة حول استرجاع النص الكامل تعلم فقط كيفية استخدام المكتبة، إذا كنت تعرف كيفية استدعاء الوظائف في المكتبة، فيمكنك تحقيق وظيفة البحث عن النص الكامل لتطبيقك،
ولكن لا تتوقع أن يكون Lucene محرك بحث مثل Google وBaidu أداة، مكتبة، يمكنك أيضًا اعتبارها واجهة برمجة تطبيقات بسيطة وسهلة الاستخدام تتضمن وظائف الفهرسة والبحث. يمكنك القيام بالكثير من الأشياء المتعلقة بالبحث باستخدام واجهة برمجة التطبيقات هذه، وهي مريحة للغاية ويمكن القيام بها يلبي احتياجاتك. يقوم التطبيق بإجراء بحث بسيط عن النص الكامل. باعتبارك مطور تطبيقات (مطور محرك بحث غير محترف)، فإن وظائفه كافية لإرضائك.
2. ما الذي يمكن أن تفعله شركة Lucene.Net؟
يستطيع Lucene فهرسة أي بيانات والبحث فيها بغض النظر عن تنسيق مصدر البيانات، طالما أنه يمكن تحويلها إلى نص، فيمكن تحليلها واستخدامها بواسطة Lucene، بمعنى آخر، سواء كانت MS word أو Html أو pdf أو يمكن استخدام أي شكل من أشكال الملفات بواسطة Lucene طالما يمكنك استخراج محتوى نصي منه. يمكنك استخدام Lucene لفهرستها والبحث فيها.
3. كيفية استخدام Lucene.Net؟
يتلخص الأمر ببساطة في: إنشاء فهرس، واستخدام الفهرس. إن إنشاء الفهرس هو تخزين أو تحليل معلومات مصدر البيانات المراد البحث فيها باعتبارها معلوماتنا الرئيسية، وترك علامة للبحث يشبه إنشاء جدول. المحتويات في Word (فهم شخصي)، استخدام الفهرس هو تحليل مصدر البيانات بناءً على معلومات الفهرس أثناء البحث واستخراج المعلومات التي نحتاجها.
يرجى إلقاء نظرة على المثال:
فئة عامة IntranetIndexer
لإنشاء فهرس
{
/**/////كاتب الفهرس
كاتب IndexWriter الخاص
// الدليل الجذر للملف المراد كتابته في الفهرس
سلسلة خاصة docRootDirectory;
// تنسيق الملف المراد مطابقته
نمط السلسلة الخاصة []
/**//// <summary>
/// تهيئة كاتب الفهرس. الدليل هو الدليل الذي تم إنشاء الفهرس فيه. صحيح يعني أنه في حالة عدم وجود ملف الفهرس، سيتم إعادة إنشاء ملف الفهرس الكتابة فوق.
/// </الملخص>
/// <param name="directory">يتم تمرير الدليل المراد فهرسته. لاحظ أنه عبارة عن قيمة سلسلة. إذا لم يكن الدليل موجودًا، فسيتم إنشاؤه تلقائيًا</param>
publicIntranetIndexer (دليل السلسلة)
{
الكاتب = new IndexWriter(directory, new StandardAnalyzer(), true);
Writer.SetUseCompoundFile(true);
}
AddDirectory الفراغ العام (دليل DirectoryInfo، نمط السلسلة [])
{
this.docRootDirectory = Directory.FullName;
this.pattern = Pattern;
addSubDirectory(directory);
}
addSubDirectory باطلة خاصة (دليل DirectoryInfo)
{
ل(int i=0;i<pattern .Length;i++)
{
foreach (FileInfo fi في الدليل.GetFiles(pattern[i]))
{
AddHtmlDocument(fi.FullName);
}
}
foreach (معلومات الدليل موجودة في الدليل.GetDirectories())
{
addSubDirectory(di);
}
}
الفراغ العام AddHtmlDocument (مسار السلسلة)
{
سلسلة exname=Path.GetExtension(path);
وثيقة الوثيقة = وثيقة جديدة ()؛
سلسلة أتش تي أم أل؛
إذا (exname.ToLower ()==".html" ||exname .ToLower ()==".htm"||exname .ToLower ()==".txt")
{
باستخدام (StreamReader sr=new StreamReader (المسار، النظام، النص، الترميز، الافتراضي))
{
html = sr.ReadToEnd();
}
}
آخر
{
باستخدام (StreamReader sr = StreamReader الجديد (المسار، System.Text.Encoding.Unicode ))
{
html = sr.ReadToEnd();
}
}
int النسبيPathStartsAt = this.docRootDirectory.EndsWith("\") ? this.docRootDirectory.Length : this.docRootDirectory.Length + 1;
سلسلة نسبية = path.Substring(relativePathStartsAt);
عنوان السلسلة = Path.GetFileName(path);
// تحديد ما إذا كانت صفحة ويب، قم بإزالة العلامة، وإلا فلا تستخدمها
إذا (exname.ToLower () = = ".html" || exname .ToLower () = = ".htm")
{
doc.Add(Field.UnStored("text", parseHtml(html)));
}
آخر
{
doc.Add (Field .UnStored ("text"، html))؛
}
doc.Add(Field.Keyword("path", النسبيPath));
//doc.Add(Field.Text("title", getTitle(html)));
doc.Add (Field .Text ("العنوان"، العنوان))؛
Writer.AddDocument(doc);
}
/**//// <الملخص>
/// إزالة العلامات من صفحات الويب
/// </الملخص>
/// <param name="html">صفحة الويب</param>
/// <returns>إرجاع نص صفحة الويب المحذوفة</returns>
سلسلة خاصة parseHtml (سلسلة HTML)
{
string temp = Regex.Replace(html, "<[^>]*>", "");
إرجاع درجة الحرارة.استبدال(" ", " ");
}
/**//// <الملخص>
/// احصل على عنوان الصفحة
/// </الملخص>
/// <param name="html"></param>
/// <returns></returns>
سلسلة خاصة getTitle (سلسلة html)
{
Match m = Regex.Match(html, "<title>(.*)</title>");
إذا (m.Groups.Count == 2)
إرجاع m.Groups[1].Value؛
إرجاع "عنوان المستند غير معروف"؛
}
/**//// <الملخص>
/// تحسين الفهرس وإغلاق الكاتب
/// </الملخص>
إغلاق الفراغ العام ()
{
Writer.Optimize();
الكاتب. إغلاق ()؛
}
}
قم أولاً بإنشاء كائن مستند، ثم قم بإضافة بعض حقول السمات إلى كائن المستند. يمكنك التفكير في كائن المستند كملف افتراضي، حيث سيتم الحصول على المعلومات منه في المستقبل من بينها يتضمن الحقل أربعة أنواع:
لن يتم تحليل بيانات العمل من هذا النوع، بل سيتم فهرستها وحفظها في الفهرس.
غير مفهرسة
لن يتم تحليل أو فهرسة البيانات من هذا النوع، بل سيتم تخزينها في الفهرس.
غير مخزنة
وعلى عكس غير المفهرس تمامًا، يتم تحليله وفهرسته، ولكن لا يتم حفظه.
نص
يشبه UnStored إذا كان نوع القيمة عبارة عن سلسلة، فسيتم حفظه. إذا كان نوع القيمة هو Reader، فلن يتم حفظه، تمامًا مثل UnStored.
وأخيرًا، تتم إضافة كل مستند إلى الفهرس.
وفيما يلي بحث في الفهرس
// إنشاء مفهرس
IndexSearcher searcher = new IndexSearcher(indexDirectory);
// تحليل حقل النص في فهرس البحث
استعلام الاستعلام = QueryParser.Parse(this.Q, "text", new StandardAnalyzer());
// ضع نتائج البحث في النتائج
عدد الزيارات = searcher.Search(query);
// إحصائيات حول إجمالي عدد السجلات التي تم البحث عنها
this.total = hits.Length();
//تسليط الضوء
QueryHighlightExtractor Highlighter = new QueryHighlightExtractor(query, new StandardAnalyzer(), "<font color=red>", "</font>");
الخطوة الأولى هي استخدام IndexSearcher لفتح ملف الفهرس لعمليات البحث اللاحقة، والمعلمة هي مسار ملف الفهرس.
والخطوة الثانية هي استخدام QueryParser لتحويل عبارات الاستعلام الأكثر قابلية للقراءة (مثل كلمة الاستعلام lucene، وبعضها). الأساليب المتقدمة lucene AND.net) في كائن استعلام يستخدمه Lucene، وتقوم
الخطوة الثالثة بإجراء البحث وإرجاع النتائج إلى مجموعة النتائج جزء في كل مرة لاعتبارات المساحة،
تتم بعد ذلك معالجة نتائج البحث وعرضها على الصفحة:
for (int i = startAt; i < resultsCount; i++)
{
المستند doc = hits.Doc(i);
= doc.Get("path");
سلسلة exname=Path.GetExtension(path);
سلسلة نص عادي؛
سلسلة str=doc.Get("العنوان");
إذا (exname==".html" || exname ==".htm" || exname ==".txt")
{
باستخدام (StreamReader sr = StreamReader الجديد (الموقع، System.Text.Encoding.Default))
{
plainText = parseHtml(sr.ReadToEnd());
}
}
آخر
{
باستخدام (StreamReader sr = StreamReader الجديد (الموقع، System.Text.Encoding.Unicode ))
{
plainText = sr.ReadToEnd();
}
}
// DataTable إضافة صفوف
DataRowrow = this.Results.NewRow();
صف["title"] = doc.Get("title");
string IP=Request.Url.Host;//احصل على عنوان IP للخادم
//Request.Url.Port;
صف["path"]=@" http://"+IP+"/WebUI/Search/documents/"+path ;
صف["sample"] = Highlighter.GetBestFragments(plainText, 80, 2, "");
this.Results.Rows.Add(row);
}
searcher.Close();// أغلق الباحث إذا كنت ترغب في الحصول على فهم أكثر تقدمًا وشمولًا وتعميقًا لـ Lucene.Net، فيرجى الرجوع إلى موقع الويب:
http: //blog.tianya.cn/blogger/view_blog.asp?BlogName=aftaft