天天看点

01 一步一步学lucene 索引

内容

创建某个目录的索引

查询索引

1.基于文件目录,创建索引

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

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

<code>/**</code>

<code>* 创建目录下的文件索引</code>

<code>*</code>

<code>* @param indexeddir</code>

<code>*            :待创建索引目录</code>

<code>* @param indextargetdir</code>

<code>*            : 索引目标路径</code>

<code>*/</code>

<code>public</code> <code>void</code> <code>newindex(string indexeddir, string indextargetdir) {</code>

<code>file filedir = </code><code>new</code> <code>file(indexeddir);</code>

<code>collection&lt;file&gt; files = fileutils.listfiles(filedir, </code><code>null</code><code>, </code><code>true</code><code>);</code>

<code>indexwriterconfig config = </code><code>new</code> <code>indexwriterconfig(version.lucene_35,</code>

<code>new</code> <code>standardanalyzer(version.lucene_35));</code>

<code>file indexfile = </code><code>new</code> <code>file(indextargetdir);</code>

<code>indexwriter iw = </code><code>null</code><code>;</code>

<code>try</code> <code>{</code>

<code>directory idxdirc = fsdirectory.open(indexfile);</code>

<code>iw = </code><code>new</code> <code>indexwriter(idxdirc, config);</code>

<code>for</code> <code>(file file : files) {</code>

<code>if</code> <code>(file.isfile()) {</code>

<code>document doc = </code><code>new</code> <code>document();</code>

<code>reader reader = </code><code>new</code> <code>filereader(file);</code>

<code>string type = filenameutils.getextension(file.getname());</code>

<code>//文件名称 域</code>

<code>doc.add(</code><code>new</code> <code>field(</code><code>"filename"</code><code>, file.getabsolutepath(),</code>

<code>field.store.yes, field.index.not_analyzed));</code>

<code>//文件内容  域</code>

<code>doc.add(</code><code>new</code> <code>field(</code><code>"content"</code><code>, reader));</code>

<code>//文件类型</code>

<code>doc.add(</code><code>new</code> <code>field(</code><code>"type"</code><code>, type, field.store.yes,</code>

<code>field.index.not_analyzed_no_norms));</code>

<code>//文件日期</code>

<code>doc.add(</code><code>new</code> <code>numericfield(</code><code>"date"</code><code>, field.store.yes, </code><code>true</code><code>)</code>

<code>.setlongvalue(file.lastmodified()));</code>

<code>//文件大小</code>

<code>doc.add(</code><code>new</code> <code>numericfield(</code><code>"size"</code><code>, field.store.yes, </code><code>false</code><code>)</code>

<code>.setintvalue(</code><code>new</code> <code>long(file.length()).intvalue()));</code>

<code>iw.adddocument(doc);</code>

<code>}</code>

<code>} </code><code>catch</code> <code>(corruptindexexception e) {</code>

<code>e.printstacktrace();</code>

<code>} </code><code>catch</code> <code>(lockobtainfailedexception e) {</code>

<code>} </code><code>catch</code> <code>(filenotfoundexception e) {</code>

<code>} </code><code>catch</code> <code>(ioexception e) {</code>

<code>} </code><code>finally</code> <code>{</code>

<code>iw.close();</code>

创建索引

<code>string indexeddir = </code><code>"f:\\lucene\\data"</code><code>;</code>

<code>string indextargetdir = </code><code>"f:\\lucene\\index"</code><code>;</code>

<code>index01 util = </code><code>new</code> <code>index01();</code>

<code>util.newindex(indexeddir, indextargetdir);</code>

执行成功后,f:/lucene/index目录下会有fdt,fdx,fnm,nrm,prx等等文件。

2.根据文件类型进行查询

<code>* 查询文件类型</code>

<code>* @param indexpath: 索引路径</code>

<code>* @param type:文件类型</code>

<code>* @param size:条目</code>

<code>public</code> <code>void</code> <code>querybyfiletype(string indexpath, string type, </code><code>int</code> <code>size) {</code>

<code>directory dir = </code><code>null</code><code>;</code>

<code>indexreader reader = </code><code>null</code><code>;</code>

<code>indexsearcher searcher = </code><code>null</code><code>;</code>

<code>dir = fsdirectory.open(</code><code>new</code> <code>file(indexpath));</code>

<code>reader = indexreader.open(dir);</code>

<code>searcher = </code><code>new</code> <code>indexsearcher(reader);</code>

<code>query query = </code><code>new</code> <code>termquery(</code><code>new</code> <code>term(</code><code>"type"</code><code>, type));</code>

<code>topdocs tops = searcher.search(query, size);</code>

<code>scoredoc[] docs = tops.scoredocs;</code>

<code>for</code> <code>(scoredoc sd : docs) {</code>

<code>document doc = searcher.doc(sd.doc);</code>

<code>system.out.print(</code><code>"filename:"</code> <code>+ doc.get(</code><code>"filename"</code><code>)+</code><code>"\t"</code><code>);</code>

<code>system.out.print(</code><code>"size:"</code> <code>+ doc.get(</code><code>"size"</code><code>));</code>

<code>system.out.println();</code>

<code>} </code><code>catch</code> <code>(exception e) {</code>

<code>reader.close();</code>

<code>system.out.println(</code><code>"查询类型为\"java\"文件列表"</code><code>);</code>

<code>util.querybyfiletype(indextargetdir, </code><code>"java"</code><code>, </code><code>100</code><code>);</code>

<code>system.out.println(</code><code>"查询类型为\"xml\"文件列表"</code><code>);</code>

<code>util.querybyfiletype(indextargetdir, </code><code>"xml"</code><code>, </code><code>100</code><code>);</code>

执行结果

<code>查询类型为</code><code>"java"</code><code>文件列表</code>

<code>filename:f:\lucene\data\java\com\service\baseservice.java   size:353</code>

<code>filename:f:\lucene\data\java\com\validate\person.java   size:471</code>

<code>filename:f:\lucene\data\java\com\validate\personvalidator.java  size:682</code>

<code>filename:f:\lucene\data\java\com\spring\aop\person.java size:101</code>

<code>filename:f:\lucene\data\java\com\spring\aop\man.java    size:151</code>

<code>filename:f:\lucene\data\java\com\spring\aop\personproxy.java    size:613</code>

<code>filename:f:\lucene\data\java\org\wh\tech\spring\aop\businessservice.java    size:173</code>

<code>filename:f:\lucene\data\java\org\wh\tech\spring\aop\businessserviceimpl.java    size:375</code>

<code>filename:f:\lucene\data\java\org\wh\tech\spring\aop\xmlexampleaspect.java   size:1654</code>

<code>查询类型为</code><code>"xml"</code><code>文件列表</code>

<code>filename:f:\lucene\data\resources\service.xml   size:2429</code>

此时,发现查询的xml文件,有重复。这是由于lucene创建索引默认是基于递增的创建方式。

<code>org.apache.lucene.index.indexwriterconfig.openmode</code>

<code>public</code> <code>static</code> <code>enum</code> <code>openmode { create, append, create_or_append }</code>

可以通过以下语句,删除索引,再创建。

1,先删后增

<code>org.apache.lucene.index.indexwriter.deleteall()</code>

2.设置创建索引的open_mode

<code>config.setopenmode(openmode.create);</code>