|
1、源码# I! ^& d m. A
import java.nio.file.Paths;
3 |% o( F3 {$ e) F: _$ T6 J, h. L0 ^- v( u3 j. P
import org.apache.lucene.analysis.Analyzer;# s6 K; M0 n+ D% V- z; E6 y/ ?
import org.apache.lucene.analysis.standard.StandardAnalyzer;
& R1 I; a7 t. ^+ G) Limport org.apache.lucene.document.Document;/ O+ i1 s8 |9 k# b/ V0 c; N
import org.apache.lucene.document.Field;
0 z9 S. Z0 z& @$ I& gimport org.apache.lucene.document.StringField;
/ g/ }9 i3 {* Wimport org.apache.lucene.document.TextField;
% _% f5 P$ N. j7 H( jimport org.apache.lucene.index.DirectoryReader;
! _- q, d- f# ?7 u- fimport org.apache.lucene.index.IndexReader;" P- A7 O7 ^) Q5 j# k1 ?7 j1 m# P
import org.apache.lucene.index.IndexWriter;
, \! r% g7 J- S" Z6 Q- D$ ^import org.apache.lucene.index.IndexWriterConfig;
& e4 K& m, n% `6 J' R, [0 ]1 qimport org.apache.lucene.index.Term;
( W; G, }) G% C% e) simport org.apache.lucene.search.IndexSearcher;
* m, F# G5 o1 \9 Rimport org.apache.lucene.search.Query;" m$ E; F* ?: {1 U/ e) L
import org.apache.lucene.search.ScoreDoc;/ B8 D0 P' m4 T) I5 L! w9 ?
import org.apache.lucene.search.TermQuery;
- q5 J0 o6 {" Ximport org.apache.lucene.search.TopDocs;
- Z$ p9 g( E/ f. L5 S! simport org.apache.lucene.store.Directory;
9 a$ x# P9 O# ^, X: O% C3 Uimport org.apache.lucene.store.FSDirectory;" Q7 p% V9 c5 y$ ?4 v3 x }7 ?) x: Q
import org.junit.Test;
- C( W9 M( r- L' t3 |, F% w
. q2 s9 z9 y; E. dpublic class IndexingTest2 {
5 n/ ~3 n4 W% f2 G+ k
/ z8 h+ \4 K, D* N" j4 | private String ids[]={"1","2","3","4"};
$ y7 m( K+ u5 _0 K private String authors[]={"Jack","Marry","John","Json"};
' R* X6 s9 g$ q& Y9 p5 B# R d private String positions[]={"accounting","technician","salesperson","boss"};- N* i/ j/ _5 n( k5 w. K; ^
private String titles[]={"Java is a good language.","Java is a cross platform language","Java powerful","You should learn java"};
* q7 @$ j, ^) }9 @1 ?! j8 O- w* F5 e R private String contents[]={0 v/ m0 v6 d: o# B
"If possible, use the same JRE major version at both index and search time.",
7 ~, Y3 s1 I) P( s q "When upgrading to a different JRE major version, consider re-indexing. ",
9 R3 ^) g3 j. m+ A "Different JRE major versions may implement different versions of Unicode,",
) _- h' Y+ z# `$ ^7 u8 X8 s "For example: with Java 1.4, `LetterTokenizer` will split around the character U+02C6,"$ L0 }/ V1 O2 W% n3 G, T7 j M: d
};
9 Q8 S$ D0 k" I; G9 c/ D% P. C% F
1 [9 O; G$ _& D, _* K private Directory dir;
: z! R; h7 a: o0 r* M9 u; D' |$ w6 E' R* d2 K+ T6 Z7 A
/**( B) f' b1 Z* h2 X" y
* 获取IndexWriter实例
8 M! ?7 `2 B# v8 D * @return
+ L/ }# G$ c- @ * @throws Exception$ t3 A8 o# @7 c" p& p
*/; k+ m( o8 K6 O7 D2 L
private IndexWriter getWriter()throws Exception{) y, a( X8 ^/ _+ W" z
Analyzer analyzer=new StandardAnalyzer(); // 标准分词器
; \& P# [" k2 C" O7 N& l D. o# M IndexWriterConfig iwc=new IndexWriterConfig(analyzer);
2 p8 r+ d7 k$ t6 { IndexWriter writer=new IndexWriter(dir, iwc);# B- Z* l0 a) h# ?. p6 G V1 ^
return writer;
- A2 Z( \" K* d2 m3 m2 R }
9 E' a( D" W9 K5 |$ ~
& m% Y7 J1 c- P' X /**# S4 H1 ~1 S2 C: i% g
* 生成索引
( o' F) D, c' t. G+ o/ C4 } * @throws Exception
* ]( H1 {; j* S7 M+ O+ T8 ` */( C- a' j2 v3 ^7 @2 E& t; s
@Test
. ^3 Z. l( ~5 B: a/ ?1 T$ \ public void index()throws Exception{; n2 C; }; g% v. q2 V
dir=FSDirectory.open(Paths.get("D:\\lucene3"));
- [2 n8 Y4 d/ Z IndexWriter writer=getWriter();
5 C+ M# K# f, F" I& }* s" { for(int i=0;i<ids.length;i++){
3 x- |7 Z# ]' d% q- ?7 @ Document doc=new Document();
) u$ [2 c+ x0 }2 p$ ^6 J' N& k doc.add(new StringField("id", ids, Field.Store.YES));7 ^6 r0 x/ k# D
doc.add(new StringField("author",authors,Field.Store.YES));' }. A7 H6 T0 n5 @
doc.add(new StringField("position",positions,Field.Store.YES));0 G8 G' J8 M8 r" y
// 加权操作
" L' I1 R; } L3 ^ TextField field=new TextField("title", titles, Field.Store.YES);
6 |) N1 U" F* Z, ?) B; ~ if("boss".equals(positions)){ `0 x& @' c1 I" u& e" m# j4 w$ J: e3 ~
field.setBoost(1.5f);
; l9 [+ M# t& r; a' ^ }
$ F/ U( V* ]' z6 P0 j, d- c% _ doc.add(field);
+ y% k Z0 r- U, o, w) p doc.add(new TextField("content", contents, Field.Store.NO));
7 L# h! U% ^; G9 v, n: p writer.addDocument(doc); // 添加文档4 q Z8 {6 k" \- S+ J
}
4 T' U/ v6 r2 j1 J+ h7 x writer.close();
; |0 p( M' [3 N* ^ }
) N% | K- @3 G* p3 j; l' A
5 W* w/ ~; }- ]8 D /**
3 \. Q x% F- @1 W% ]1 G * 查询! O) w4 D; g) p, x J
* @throws Exception" k% \/ n( C8 s6 I8 ~% r: m/ m
*/4 v4 a% z* v% o2 W5 j+ @
@Test
) w0 f+ K6 }5 M. R public void search()throws Exception{
2 v4 g$ |; Q( H0 | dir=FSDirectory.open(Paths.get("D:\\lucene3"));7 ]& I; k; {; w, Z7 e6 ~. o+ J/ ?. J
IndexReader reader=DirectoryReader.open(dir);6 r& m% B5 E) u: ~7 s
IndexSearcher is=new IndexSearcher(reader);1 k8 V1 ?0 S' G! r W' G, h
String searchField="title";7 `" l+ Z/ m+ T; N
String q="java";& K' h5 v! E! r
Term t=new Term(searchField,q);
- c5 t7 Y7 d; ~/ t. p1 y; r Query query=new TermQuery(t);" A. a+ E1 g' |. z! K
TopDocs hits=is.search(query, 10);
) q. @+ z/ V v9 m8 Y' l# q System.out.println("匹配 '"+q+"',总共查询到"+hits.totalHits+"个文档");; B) I; @6 R% N5 W& l7 K
for(ScoreDoc scoreDoc:hits.scoreDocs){( v+ v- H% m. J& `) M( M
Document doc=is.doc(scoreDoc.doc);
. X6 ]4 O2 ^1 @0 X System.out.println(doc.get("author"));. f& u* _1 E4 o) w( {
}9 k7 O; ~# u" b' Z2 c1 u
reader.close();
* [/ m9 P- X" o: m9 [! Z0 O }8 }& i( r) c9 ]4 R* L
; L# b) w) N+ e% e7 j
}
# W2 U# |! z1 l- ?- u1 w W# Q0 X- e. S! g
1 I/ m) J5 b& u6 m/ c$ Y6 C/ B
; f1 h0 J4 Z' G |7 p4 i* J |
|