Lucene學習總結

[size=x-large]一、Lucene 原理[/size]

[size=medium][b]Lucene是一個高效的,基於Java的全文檢索庫[/b]。

在生活中會遇到各種各樣的數據, 而數據可以概括爲兩種, [b]結構化數據[/b]和[b]非結構化數據[/b]。
1、結構化數據指具有固定格式或有限長度的數據,如數據庫,元數據等。
2、非機構化數據指指不定長或無固定格式的數據,如郵件,word文檔等。

當我們需要全文檢索某個信息,主要有兩種方法:
a. [b]順序掃描法[/b](Serial Scanning):一個一個文件的全文搜索,這種當然是很慢的了。
b. [b]通過索引查找法[/b]:通過對非結構數據進行重新組織,建立索引,再對索引進行查找。而Lucene 就是用的這個原理進行全文檢索。

Lucene的全文檢索大體分兩個過程,索引創建(Indexing)和搜索索引(Search)。
a.[b]索引創建[/b]:將現實世界中所有的結構化和非結構化數據提取信息,創建索引的過程。
b.[b]搜索索引[/b]:就是得到用戶的查詢請求,搜索創建的索引,然後返回結果的過程。

下面這幅圖來自《Lucene in action》,描述了Lucene 的檢索過程和全文檢索的一般過程。[/size]
[img]http://hi.csdn.net/attachment/201002/1/3634917_1265048519dbeE.png[/img]

參考自:[url]http://www.cnblogs.com/forfuture1978/archive/2010/06/13/1757479.html[/url]

[size=x-large]二、Lucene例子[/size]
下面是建立索引和查找文件的簡單例子
a.建立索引

private static void indexFiles() throws IOException {
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);

Directory dir = FSDirectory.open(Paths.get("C:\\shuxiang\\tmp\\lucene6"));
IndexWriter writer = new IndexWriter(dir, config);
Document doc = new Document();
Path path = Paths.get("C:\\shuxiang\\tmp\\Edit5");
InputStream newInputStream = Files.newInputStream(path);
InputStreamReader inputStreamReader = new InputStreamReader(newInputStream, StandardCharsets.UTF_8);
Field pathField = new StringField("path", path.toString(), Field.Store.YES);
doc.add(pathField);
TextField field = new TextField("contents", new BufferedReader(inputStreamReader));
doc.add(field);
writer.addDocument(doc);
writer.close();

}


b. 查找文件

private static void searchFile() throws IOException, ParseException {
Directory dir = FSDirectory.open(Paths.get("C:\\shuxiang\\tmp\\lucene6"));
IndexReader reader = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);

Analyzer analyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser("contents", analyzer);
Query query = parser.parse("92646KHJ4");
System.out.println("Searching for: " + query.toString("contents"));

TopDocs topDocs = searcher.search(query, 100000);
System.out.println(topDocs.totalHits + " total matching documents");
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document hitDoc = searcher.doc(scoreDoc.doc);
System.out.println("hit:" + hitDoc.get("path"));
}
}


Lucene官網有兩個很好的例子,如下:
[url]https://lucene.apache.org/core/6_2_1/demo/src-html/org/apache/lucene/demo/IndexFiles.html[/url]

[url]https://lucene.apache.org/core/6_2_1/demo/src-html/org/apache/lucene/demo/SearchFiles.html[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章