内容
创建某个目录的索引
查询索引
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<file> 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>