lucene 实战(二)lucene 索引管理

创建索引

1.Field.Store.YES (NO)存储域选项

设置为N表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完全还原

2.Field.Index(索引选项)

Index.ANALYZED:进行分词和索引,适用于标题、内容等

Index.NO:不进行索引。

/** * 创建索引-cfl-2015年5月26日 */public void createIndex(){//用于写入索引文件的writer对象IndexWriter writer =null;try {//载入writer配置writer=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,new StandardAnalyzer(Version.LUCENE_35)));Document doc=null;//遍历数组写入域信息for(int i=0;i<ids.length;i++){doc=new Document();doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED));doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED));doc.add(new Field("mail",mails[i],Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));doc.add(new Field("content",contents[i],Field.Store.NO,Field.Index.ANALYZED_NO_NORMS));writer.addDocument(doc);//取得含有特定字符的数组String strMail=mails[i].substring(mails[i].lastIndexOf("@")-1);System.out.println(strMail);//为指定域添加权重if(scoreMap.containsKey(strMail)){doc.setBoost(scoreMap.get(i));}else{doc.setBoost(0.5f);}}System.out.println("索引创建成功!");} catch (CorruptIndexException e) {e.printStackTrace();} catch (LockObtainFailedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{closeWriter(writer);}}

在配置IndexWriterConfig时,需要注意的是配置指定的版本号。这里还是体现了lucene开发者成熟的设计理念的。为用户在自行选择版本的给于了充分的自由度的。

创建索引过程类似于关系型数据库中的记录、字段的创建,创建doc相当于创建一条条的数据库记录。而field的创建对应着字段的创建。

下图是索引建立后的文件

ps:当删除某个索引之后,生成.del文件

查询

1.一般查询

/** * 查询索引的值-cfl-2015年5月26日 */public void queryIndex(){//1.创建indexReaderIndexReader reader=null;try {//可以有效通过reader获取文档的数量reader=IndexReader.open(directory);System.out.println("maxDocs:"+reader.maxDoc());System.out.println("numDocs:"+reader.numDocs());System.out.println("deleteDocs:"+reader.numDeletedDocs());} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{closeReader(reader);}}

利用IndexReader来获取索引文件目录中总文件数,索引文件数,,已删除文件数信息。

/** * 精确查询索引根据关键字-cfl-2015年5月27日 */public void queryIndexByTerm(){IndexReader reader=null;try {reader=IndexReader.open(directory);IndexSearcher searcher=new IndexSearcher(reader);TermQuery query=new TermQuery(new Term("content","bootst"));TopDocs topDocs=searcher.search(query, 10);for(ScoreDoc td:topDocs.scoreDocs){System.out.println(td.toString());System.out.println(searcher.doc(td.doc).get("name"));}} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{closeReader(reader);}}

查询存在于content域中含有关键词bootst的数据。

IndexSearcher searcher=new IndexSearcher(reader);TermQuery query=new TermQuery(new Term("content","bootst"));TopDocs topDocs=searcher.search(query, 10);

这样的一个过程类似在关系数据库查询过程中

1.利用reader建立searcher对象

2.配置Term关键词

3.查询10条数据

删除

1.指定删除

记忆像是倒在手心里的水,不论是摊平还是握紧,

lucene 实战(二)lucene 索引管理

相关文章:

你感兴趣的文章:

标签云: