天天看點

Lucene 簡單案例

版本 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&lt;Document&gt; 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&lt;Document&gt; documents = </code><code>new</code> <code>ArrayList&lt;Document&gt;();</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&lt;Document&gt; 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&lt;Document&gt; 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&lt;Document&gt; docs = </code><code>new</code> <code>ArrayList&lt;Document&gt;();</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; 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&lt;Document&gt; 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&lt;Document&gt; 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&lt;Document&gt; 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