ल्यूसिने - पहला आवेदन
इस अध्याय में, हम ल्यूसीन फ्रेमवर्क के साथ वास्तविक प्रोग्रामिंग सीखेंगे। इससे पहले कि आप Lucene फ्रेमवर्क का उपयोग करके अपना पहला उदाहरण लिखना शुरू करें, आपको यह सुनिश्चित करना होगा कि आपने Lucene - पर्यावरण सेटअप ट्यूटोरियल में स्पष्ट रूप से अपना Lucene वातावरण सेट किया है । यह अनुशंसा की जाती है कि आपके पास ग्रहण आईडीई का कार्यसाधक ज्ञान हो।
आइए अब हम एक सरल खोज एप्लिकेशन लिखकर आगे बढ़ते हैं जो खोज परिणामों की संख्या को प्रिंट करेगा। हम इस प्रक्रिया के दौरान बनाए गए अनुक्रमितों की सूची भी देखेंगे।
चरण 1 - जावा प्रोजेक्ट बनाएं
पहला कदम ग्रहण आईडीई का उपयोग करके एक सरल जावा प्रोजेक्ट बनाना है। विकल्प का पालन करेंFile > New -> Project और अंत में चयन करें Java Projectविज़ार्ड सूची से विज़ार्ड। अब अपने प्रोजेक्ट का नाम बताइएLuceneFirstApplication विज़ार्ड विंडो का उपयोग निम्नानुसार है -
एक बार जब आपका प्रोजेक्ट सफलतापूर्वक बन जाता है, तो आपके पास निम्नलिखित सामग्री होगी Project Explorer -
चरण 2 - आवश्यक पुस्तकालय जोड़ें
आइए अब हम अपनी परियोजना में ल्यूसिन कोर फ्रेमवर्क लाइब्रेरी जोड़ें ऐसा करने के लिए, अपने प्रोजेक्ट के नाम पर राइट क्लिक करेंLuceneFirstApplication और फिर संदर्भ मेनू में उपलब्ध निम्न विकल्प का पालन करें: Build Path -> Configure Build Path निम्नानुसार जावा बिल्ड पाथ विंडो प्रदर्शित करने के लिए -
अब उपयोग करें Add External JARs के तहत उपलब्ध बटन Libraries Lucene स्थापना निर्देशिका से निम्नलिखित कोर JAR जोड़ने के लिए टैब -
- lucene-core-3.6.2
चरण 3 - स्रोत फ़ाइलें बनाएँ
आइए अब हम वास्तविक स्रोत फाइल बनाते हैं LuceneFirstApplicationपरियोजना। पहले हमें एक पैकेज बनाने की आवश्यकता है जिसे कहा जाता हैcom.tutorialspoint.lucene. ऐसा करने के लिए, पैकेज एक्सप्लोरर अनुभाग में src पर राइट-क्लिक करें और विकल्प का पालन करें: New -> Package।
आगे हम बनाएंगे LuceneTester.java और अन्य जावा वर्गों के तहत com.tutorialspoint.lucene पैकेज।
LuceneConstants.java
इस वर्ग का उपयोग विभिन्न स्थिरांक प्रदान करने के लिए किया जाता है, जिसका उपयोग नमूना अनुप्रयोग में किया जाता है।
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
TextFileFilter.java
इस वर्ग का उपयोग एक के रूप में किया जाता है .txt file फिल्टर।
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
public class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}
Indexer.java
इस वर्ग का उपयोग कच्चे डेटा को अनुक्रमित करने के लिए किया जाता है ताकि हम ल्यूसिन लाइब्रेरी का उपयोग करके इसे खोज योग्य बना सकें।
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Indexer {
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException {
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
public void close() throws CorruptIndexException, IOException {
writer.close();
}
private Document getDocument(File file) throws IOException {
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS, new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME,
file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH,
file.getCanonicalPath(),Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
public int createIndex(String dataDirPath, FileFilter filter)
throws IOException {
//get all files in the data directory
File[] files = new File(dataDirPath).listFiles();
for (File file : files) {
if(!file.isDirectory()
&& !file.isHidden()
&& file.exists()
&& file.canRead()
&& filter.accept(file)
){
indexFile(file);
}
}
return writer.numDocs();
}
}
Searcher.java
इस वर्ग का उपयोग अनुक्रमित सामग्री की खोज के लिए इंडेक्सर द्वारा बनाई गई अनुक्रमणिका को खोजने के लिए किया जाता है।
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Searcher {
IndexSearcher indexSearcher;
QueryParser queryParser;
Query query;
public Searcher(String indexDirectoryPath)
throws IOException {
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
public TopDocs search( String searchQuery)
throws IOException, ParseException {
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
public void close() throws IOException {
indexSearcher.close();
}
}
LuceneTester.java
इस वर्ग का उपयोग ल्यूसीन लाइब्रेरी की अनुक्रमण और खोज क्षमता का परीक्षण करने के लिए किया जाता है।
package com.tutorialspoint.lucene;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Indexer indexer;
Searcher searcher;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.createIndex();
tester.search("Mohan");
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
private void createIndex() throws IOException {
indexer = new Indexer(indexDir);
int numIndexed;
long startTime = System.currentTimeMillis();
numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
long endTime = System.currentTimeMillis();
indexer.close();
System.out.println(numIndexed+" File indexed, time taken: "
+(endTime-startTime)+" ms");
}
private void search(String searchQuery) throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
TopDocs hits = searcher.search(searchQuery);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime));
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.println("File: "
+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
}
चरण 4 - डेटा और इंडेक्स निर्देशिका निर्माण
हमने record1.txt से record10.txt के 10 पाठ फ़ाइलों का उपयोग किया है जिसमें छात्रों के नाम और अन्य विवरण हैं और उन्हें निर्देशिका में रखा गया है E:\Lucene\Data। डेटा का परीक्षण करें । एक सूचकांक निर्देशिका पथ के रूप में बनाया जाना चाहिएE:\Lucene\Index। इस प्रोग्राम को चलाने के बाद, आप उस फ़ोल्डर में बनाई गई इंडेक्स फाइलों की सूची देख सकते हैं।
चरण 5 - कार्यक्रम चलाना
एक बार जब आप स्रोत, कच्चे डेटा, डेटा निर्देशिका और इंडेक्स डायरेक्टरी के निर्माण के साथ हो जाते हैं, तो आप अपने प्रोग्राम को संकलित करने और चलाने के लिए तैयार होते हैं। ऐसा करने के लिए, रखेंLuceneTester.Java फ़ाइल टैब सक्रिय है और या तो उपयोग करें Run ग्रहण आईडीई या उपयोग में उपलब्ध विकल्प Ctrl + F11 संकलन करने और चलाने के लिए LuceneTesterआवेदन। यदि आवेदन सफलतापूर्वक चलता है, तो यह ग्रहण आईडीई के कंसोल में निम्न संदेश को प्रिंट करेगा -
Indexing E:\Lucene\Data\record1.txt
Indexing E:\Lucene\Data\record10.txt
Indexing E:\Lucene\Data\record2.txt
Indexing E:\Lucene\Data\record3.txt
Indexing E:\Lucene\Data\record4.txt
Indexing E:\Lucene\Data\record5.txt
Indexing E:\Lucene\Data\record6.txt
Indexing E:\Lucene\Data\record7.txt
Indexing E:\Lucene\Data\record8.txt
Indexing E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms
1 documents found. Time :0
File: E:\Lucene\Data\record4.txt
एक बार जब आप कार्यक्रम सफलतापूर्वक चला लेते हैं, तो आपके पास निम्नलिखित सामग्री होगी index directory -