لوسین (رایانه)

لوسین یک کتابخانه بازیابی اطلاعات(Information Retrieval) متن باز است که در سال ۱۹۹۹ توسط Doug cutting نوشته شده است.
با استفاده از آن می‌توان اسناد را نمایه سازی کرد سپس به روی آنها جستجو کرد.
Lucene جزو پروژه‌های Apache و تحت لیسانس ASF است.
موتورهای جستجو نیز اطلاعات را نمایه گذاری می‌کنند و جستجو را بر روی نمایه‌ها انجام می‌دهند.
نمایه
نمایه وسیله‌ای است برای هدایت منظم به یک متن، محتوا، مجموعه‌ای از مدارک یا هر گونه اطلاعات ضبط شده‌ای که به شکل
معمولا الفبایی مرتب شده باشد و با استفاده از شیوه خاص و نظام مند
ارجاعی مشخص، موقعیت و محل هر مطلب را در مرحله بازیابی اطلاعات نشان دهد.
واحد اصلی نمایه سند است هر سند شامل یک یا چند ستون (Field) است.
ساختار نمایه تولید شده توسط لوسین نمایه معکوس است. این ساختمان داده هسته تمام موتورهای جستجو موجود است.
ابتدا سند ساخته می‌شود سپس ستون‌ها ساخته و به سند اضافه می‌شوند.
;()Document doc = new Document
;((document.add(new TypeField("fildName",value , YES/NO
TypeFieldمی‌تواند TextFieldیا StringField یا FloatField و… باشد.
Index writer
از IndexWriter برای ایجاد نمایه از شیء استفاده می‌شود.
شیء IndexWriter در زمان ایجاد دو شیء Analyzer و Directory را دریافت م ی کند.
شیء Directory پوشه محل ذخیره‌سازی نمایه را مشخص می‌کند شیء. Analyzer نحوه تحلیل ستون‌ها را نشان می‌دهد متغیر بولین اختیاری بوده و به طور پیش فرض false م ی‌باشد
جستجو
بعد از نمایه ساز ی اسناد، می‌توان بر روی نمایه‌های ساخته شده جستجو انجام داد.
کلاسهای اصلی لوسین برای جستجو عبارت اند از IndexSearcher و Query و زیر کلاس‌های آنها عبارت اند از
ScoreDoc و TopDocs ,QueryParser که در ادامه کاربرد هر متد آمده است
IndexSearcher: کلاس اصلی جستجو درلوسین که برای جستجو از متدهای آن استفاده می‌شود
QueryParsey: کلاسی برای پردازش یک عبارت و تبدیل آن به یک پرس و جو
TopDocs: شی برای نگهداری سندهای با امتیاز بالا بازگشتی جستجو
ScoreDoc: آرای ه‌ای برای دسترسی به هریک از نتایج TopDocs
در لوسین نتایج بازگشتی پرس و جو به صورت پیش فرض بر اساس امتیاز مرتب می‌شوند که پارامترهای مختلفی در محاسبه امتیاز نقش دارند
بهتر است یک شیء IndexSearcher را در کل برنامه، برای پاسخ گویی به پرس و جوها استفاده کنیم. به بیان دیگر پس از انجام یک جستجو آن را نبندیم و برای پرس و جوهای دیگر نیز از همان استفاده شود.
مثال
public class HelloLucene {
public static void main(String args) throws IOException, ParseException {
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
Directory index = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);
IndexWriter w = new IndexWriter(index, config);
addDoc(w, "Lucene in Action", "193398817");
addDoc(w, "Lucene for Dummies", "55320055Z");
addDoc(w, "Managing Gigabytes", "55063554A");
addDoc(w, "The Art of Computer Science", "9900333X");
w.close();
String querystr = args.length> 0 ? args0: "lucene";.
Query q = new QueryParser(Version.LUCENE_40, "title", analyzer).parse(querystr);
int hitsPerPage = ۱۰;
IndexReader reader = DirectoryReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
searcher.search(q, collector);
ScoreDoc hits = collector.topDocs().scoreDocs;
System.out.println("Found " + hits.length + " hits.");
for(int i=۰;i<hits.length;++i) {
int docId = hitsi.doc;
Document d = searcher.doc(docId);
System.out.println((i + 1) + ". " + d.get("isbn") + "\t" + d.get("title"));
reader.close();
private static void addDoc(IndexWriter w, String title, String isbn) throws IOException {
Document doc = new Document();
doc.add(new TextField("title", title, Field.Store.YES));
doc.add(new StringField("isbn", isbn, Field.Store.YES));
w.addDocument(doc);