版本 Lucene 5.2
引入jar包
<a href="http://s3.51cto.com/wyfs02/M02/6E/98/wKiom1WAzRuzFPcWAABLIED80uk268.jpg" target="_blank"></a>
一 DirectoryProvider 提供索引的存儲方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<code>package</code> <code>com;</code>
<code>import</code> <code>java.io.IOException;</code>
<code>import</code> <code>java.nio.file.Path;</code>
<code>import</code> <code>java.nio.file.Paths;</code>
<code>import</code> <code>org.apache.lucene.store.Directory;</code>
<code>import</code> <code>org.apache.lucene.store.FSDirectory;</code>
<code>import</code> <code>org.apache.lucene.store.RAMDirectory;</code>
<code>public</code> <code>class</code> <code>DirectoryProvider {</code>
<code> </code>
<code> </code><code>public</code> <code>static</code> <code>Directory createRAMDirectory(){</code>
<code> </code><code>return</code> <code>new</code> <code>RAMDirectory();</code><code>// 使用記憶體存儲索引</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>static</code> <code>Directory createFSDirectory(String filePath){</code>
<code> </code><code>Path path = Paths.get(filePath);</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>return</code> <code>FSDirectory.open(path);</code><code>// 使用磁盤使用索引</code>
<code> </code><code>} </code><code>catch</code> <code>(IOException e) {</code>
<code> </code><code>throw</code> <code>new</code> <code>RuntimeException(e);</code>
<code> </code><code>}</code>
<code>}</code>
二 DocumentLoader建立文檔
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<code>import</code> <code>java.io.BufferedReader;</code>
<code>import</code> <code>java.io.File;</code>
<code>import</code> <code>java.io.FileReader;</code>
<code>import</code> <code>java.util.ArrayList;</code>
<code>import</code> <code>java.util.List;</code>
<code>import</code> <code>org.apache.lucene.document.Document;</code>
<code>import</code> <code>org.apache.lucene.document.Field;</code>
<code>import</code> <code>org.apache.lucene.document.TextField;</code>
<code>public</code> <code>class</code> <code>DocumentLoader {</code>
<code> </code><code>private</code> <code>static</code> <code>DocumentLoader documentLoader = </code><code>new</code> <code>DocumentLoader();</code>
<code> </code><code>private</code> <code>DocumentLoader(){}</code>
<code> </code><code>public</code> <code>static</code> <code>DocumentLoader getInstance(){</code>
<code> </code><code>return</code> <code>documentLoader;</code>
<code> </code><code>public</code> <code>List<Document> loadDefaultDocuments(){</code>
<code> </code><code>String filePath = </code><code>"D:\\"</code><code>;</code>
<code> </code>
<code> </code><code>File dir = </code><code>new</code> <code>File(filePath);</code>
<code> </code><code>File[] files = dir.listFiles();</code>
<code> </code><code>List<Document> documents = </code><code>new</code> <code>ArrayList<Document>();</code>
<code> </code><code>for</code><code>(File file : files){</code>
<code> </code><code>String filename = file.getName();</code>
<code> </code><code>String content = readFileContent(file);</code>
<code> </code><code>Document document = </code><code>new</code> <code>Document();</code>
<code> </code><code>document.add(</code><code>new</code> <code>TextField(</code><code>"filename"</code><code>,filename, Field.Store.YES));</code>
<code> </code><code>document.add(</code><code>new</code> <code>TextField(</code><code>"content"</code><code>,content, Field.Store.YES));</code>
<code> </code>
<code> </code><code>documents.add(document);</code>
<code> </code><code>return</code> <code>documents;</code>
<code> </code><code>public</code> <code>String readFileContent(File file) {</code>
<code> </code><code>StringBuilder sb = </code><code>new</code> <code>StringBuilder();</code>
<code> </code><code>BufferedReader br = </code><code>null</code><code>;</code>
<code> </code><code>br = </code><code>new</code> <code>BufferedReader(</code><code>new</code> <code>FileReader(file));</code>
<code> </code><code>String line = </code><code>null</code><code>;</code>
<code> </code><code>while</code><code>((line=br.readLine())!=</code><code>null</code><code>){</code>
<code> </code><code>sb.append(line).append(</code><code>"\r\n"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>} </code><code>catch</code> <code>(Exception e) {</code>
<code> </code><code>}</code><code>finally</code><code>{</code>
<code> </code><code>if</code><code>(br!=</code><code>null</code><code>){</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>br.close();</code>
<code> </code><code>} </code><code>catch</code> <code>(IOException e) {}</code>
<code> </code><code>return</code> <code>sb.toString();</code>
三 IndexCreator 建立索引
<code>import</code> <code>org.apache.lucene.analysis.Analyzer;</code>
<code>import</code> <code>org.apache.lucene.index.IndexWriter;</code>
<code>import</code> <code>org.apache.lucene.index.IndexWriterConfig;</code>
<code>public</code> <code>class</code> <code>IndexCreator {</code>
<code> </code><code>public</code> <code>static</code> <code>Directory createIndex(Analyzer analyzer,Directory indexDirectory,List<Document> documents) </code><code>throws</code> <code>Exception {</code>
<code> </code><code>IndexWriterConfig config = </code><code>new</code> <code>IndexWriterConfig(analyzer);</code>
<code>// config.setOpenMode(OpenMode.CREATE);</code>
<code> </code><code>IndexWriter indexWriter = </code><code>new</code> <code>IndexWriter(indexDirectory, config);</code>
<code> </code><code>for</code><code>(Document document:documents){</code>
<code> </code><code>indexWriter.addDocument(document);</code>
<code> </code><code>indexWriter.close();</code>
<code> </code><code>return</code> <code>indexDirectory;</code>
四 Searcher 查詢器,查詢指定文檔
<code>import</code> <code>org.apache.lucene.analysis.standard.StandardAnalyzer;</code>
<code>import</code> <code>org.apache.lucene.index.DirectoryReader;</code>
<code>import</code> <code>org.apache.lucene.queryparser.classic.QueryParser;</code>
<code>import</code> <code>org.apache.lucene.search.IndexSearcher;</code>
<code>import</code> <code>org.apache.lucene.search.Query;</code>
<code>import</code> <code>org.apache.lucene.search.ScoreDoc;</code>
<code>public</code> <code>class</code> <code>Searcher {</code>
<code> </code><code>private</code> <code>StandardAnalyzer analyzer;</code>
<code> </code><code>private</code> <code>Directory indexDirectory;</code>
<code> </code><code>public</code> <code>Searcher(StandardAnalyzer analyzer, Directory indexDirectory) {</code>
<code> </code><code>this</code><code>.analyzer = analyzer;</code>
<code> </code><code>this</code><code>.indexDirectory = indexDirectory;</code>
<code> </code><code>public</code> <code>List<Document> query(String queryKey,String queryValue) </code><code>throws</code> <code>Exception {</code>
<code> </code><code>// do search</code>
<code> </code><code>DirectoryReader directoryReader = DirectoryReader.open(indexDirectory);</code>
<code> </code><code>IndexSearcher isearcher = </code><code>new</code> <code>IndexSearcher(directoryReader);</code>
<code> </code><code>QueryParser parser = </code><code>new</code> <code>QueryParser(queryKey, analyzer);</code>
<code> </code><code>Query query = parser.parse(queryValue);</code>
<code> </code><code>ScoreDoc[] hits = isearcher.search(query, </code><code>1000</code><code>).scoreDocs;</code>
<code> </code><code>List<Document> docs = </code><code>new</code> <code>ArrayList<Document>();</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < hits.length; ++i) {</code>
<code> </code><code>int</code> <code>docId = hits[i].doc;</code>
<code> </code><code>Document doc = isearcher.doc(docId);</code>
<code> </code><code>docs.add(doc);</code>
<code> </code><code>directoryReader.close();</code>
<code> </code><code>return</code> <code>docs;</code>
五 Main 測試
<code>public</code> <code>class</code> <code>Main {</code>
<code> </code><code>/**</code>
<code> </code><code>* @param args</code>
<code> </code><code>* @throws IOException</code>
<code> </code><code>*/</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) </code><code>throws</code> <code>Exception {</code>
<code> </code><code>StandardAnalyzer analyzer = </code><code>new</code> <code>StandardAnalyzer();</code>
<code> </code><code>Directory indexDirectory = DirectoryProvider.createRAMDirectory();</code>
<code>// Directory indexDirectory = DirectoryProvider.createFSDirectory("E:\\mine\\j2ee\\Lucene\\src\\indexes");</code>
<code> </code><code>List<Document> loadedDocuments = DocumentLoader.getInstance().loadDefaultDocuments();</code>
<code> </code><code>IndexCreator.createIndex(analyzer,indexDirectory,loadedDocuments);</code>
<code> </code><code>Searcher searcher = </code><code>new</code> <code>Searcher(analyzer,indexDirectory);</code>
<code> </code><code>List<Document> res = searcher.query(</code><code>"filename"</code><code>, </code><code>"artist"</code><code>);</code>
<code> </code><code>printResult(res);</code>
<code> </code><code>private</code> <code>static</code> <code>void</code> <code>printResult(List<Document> documents){</code>
<code> </code><code>System.out.println(</code><code>"found "</code><code>+documents.size());</code>
<code> </code><code>for</code><code>(Document document : documents){</code>
<code> </code><code>String filename = document.get(</code><code>"filename"</code><code>);</code>
<code> </code><code>String content = document.get(</code><code>"content"</code><code>);</code>
<code> </code><code>System.out.println(</code><code>"filename:"</code><code>+filename);</code>
<code> </code><code>System.out.println(</code><code>"content:\n"</code><code>+content);</code>
本文轉自 antlove 51CTO部落格,原文連結:http://blog.51cto.com/antlove/1662434