版本 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