天天看点

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