在學(xué)lucene 之初看了許多書(shū),都是走馬觀花,沒(méi)有項(xiàng)目的驅(qū)動(dòng)下,來(lái)一個(gè)用例demo感覺(jué)也不是很難,“我會(huì)了”這是我的第一感覺(jué)。
在2013年底公司接到一個(gè)項(xiàng)目用到lucene,這是我第一次正真接觸Lucene,代碼比較老3.6版本,不適合新項(xiàng)目的需求(空間查詢(xún))。于是下載了最新版本 4.51,有帶“空間查詢(xún)”模塊。各大搜索引擎都沒(méi)有找到像樣例子,于是想到了lucene svn的 trunk目錄測(cè)試用例中找到了測(cè)試?yán)?,開(kāi)始了一段lucene之旅。
寫(xiě)數(shù)據(jù),創(chuàng)建IndexWriter,通過(guò)它的構(gòu)造函數(shù)需要一個(gè)索引目錄(Diectory)和索引寫(xiě)入配置項(xiàng)(InderWriterConfig),直接上代碼:
//設(shè)置寫(xiě)入目錄(好幾種呵呵)
Directory d=FSDirectory.open(new File("D:/luceneTest"));
//設(shè)置分詞 StandardAnalyzer(會(huì)把句子中的字單個(gè)分詞)
Analyzer analyzer= new StandardAnalyzer(Version.LUCENE_45);
//設(shè)置索引寫(xiě)入配置
IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_45,analyzer);
//設(shè)置創(chuàng)建模式
//config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
IndexWriter indexwriter= new IndexWriter(d,config);
上面四行代碼就創(chuàng)建好了indexwriter,下面把數(shù)據(jù)填入就好了,寫(xiě)入有多種方式如下圖:

用 addDocment 舉例代碼如下:
Document doc=new Document();
doc.add(new StringField("id", "1", Store.YES));
doc.add(new StringField("name", "brockhong", Store.YES));
doc.add(new TextField("content", "lucene 文檔第一次寫(xiě)看著給分吧", Store.YES));
//寫(xiě)入數(shù)據(jù)
indexwriter.addDocument(doc);
//提交
indexwriter.commit();
用 Luke 工具查看Text列,這是標(biāo)準(zhǔn)分詞惹的禍哦!寫(xiě)入成功。

讀數(shù)據(jù)查詢(xún),創(chuàng)建 IndexSearcher 構(gòu)造函數(shù)設(shè)置indexReader ,輸入查詢(xún)條件,上面content字段數(shù)據(jù)設(shè)置了分詞,所以必須通過(guò)查詢(xún)解析類(lèi)QueryParser設(shè)定分詞字段、版本、分詞模式,并通過(guò)parse方法得到查詢(xún)條件。代碼如下:
//讀數(shù)據(jù)
//創(chuàng)建 indexReader 這個(gè)已過(guò)時(shí) IndexReader.open(d),里面的代碼一樣可能為了兼容老版本
IndexReader indexReader = DirectoryReader.open(d);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//查詢(xún) 設(shè)置分詞字段
QueryParser queryParser = new QueryParser(Version.LUCENE_45, "content",
new StandardAnalyzer(Version.LUCENE_45));
//or 關(guān)系 “給”、“分”
queryParser.setDefaultOperator(QueryParser.OR_OPERATOR);
Query query = queryParser.parse("給分");
TopDocs results = indexSearcher.search(query, 100);
int numTotalHits = results.totalHits;
System.out.println("共 " + numTotalHits + " 完全匹配的文檔");
ScoreDoc[] hits = results.scoreDocs;
for (int i = 0; i < hits.length; i++) {
Document document = indexSearcher.doc(hits[i].doc);
System.out.println("content:" + document.get("content"));
}
pasting