lucence索引的创建与简单的查询

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,可以用来做全文的检索,最近在学习lucence,所以想写一下关于lucence的博客,既是为了能为同样学习lucence的同学一些参考,同时也为巩固自己的学习。下面就位大家介绍lucence索引的创建和对索引的查询。

package com.lsl.lucence;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.FloatField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class CreateIndexAndSearch {
	/**
	 * 要进行索引的内容
	 */
	public static String[] titles = {"java","lucence","c++"};
	
	public static String[] contents = {"i like java","lucence is a framwork","c++ is good languge"};
	
	public static float[] prices ={100l,200l,300l};
	
	private Directory directory;
	
	private IndexWriter indexWriter;
	
	private DirectoryReader indexReader;
	
	public CreateIndexAndSearch() {
		this.init();
	}
	
	private void init(){
		File indexDir = new File("indexDir");
		//创建简单分词器
		Analyzer analyzer = new StandardAnalyzer();
		//创建IndexWriterConfig
		IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer);
		try {
			this.directory = FSDirectory.open(indexDir);
			this.indexWriter = new IndexWriter(directory, writerConfig);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 获取IndexReader
	 * @return
	 */
	public IndexReader getIndexReader(){
		IndexReader indexReader = null;
		try {
			if (this.indexReader == null) {
				indexReader = this.indexReader = DirectoryReader.open(directory);
			} else {
				System.out.println(this.indexReader);
				indexReader = DirectoryReader.openIfChanged(this.indexReader);
				if( indexReader==null ){
					indexReader = this.indexReader;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return indexReader;
	}
	
	public void createIndex(){
		//lucence中写入索引的最小单元就是Document 类似于数据库中的表
		//而Field则类似于表中的字段
		Document doc = null;
		try {
			for (int i = 0; i < 3; i++) {
				doc = new Document();
				//StringField 不分词,要索引
				//TextField 要分词,要索引
				//FloatField 不分词,要索引
				//Field.Store.YES 要保持内容
				//Field.Store.NO 不保存内容
				doc.add(new StringField("title", titles[i], Field.Store.YES));//StringField 不分词,要索引
				doc.add(new TextField("content", contents[i], Field.Store.NO));
				doc.add(new FloatField("price", prices[i], Field.Store.YES));
				indexWriter.addDocument(doc);
			}
			//由于我们没有关闭indexWriter 所以学院提交
			indexWriter.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public void search(String str){
		IndexReader reader = this.getIndexReader();
		//创建IndexSearcher
		IndexSearcher searcher = new IndexSearcher(reader);
		try {
			//通过queryParser穿件query
			QueryParser parser = new QueryParser("content",
					new StandardAnalyzer());
			Query query = parser.parse(str);
			//执行查询 获取TopDocs 对象
			TopDocs topDocs = searcher.search(query, 10);
			ScoreDoc[] sds = topDocs.scoreDocs;
			for( ScoreDoc sd:sds ){
				Document doc = searcher.doc(sd.doc);
				System.out.print("doc编号:"+sd.doc);
				System.out.print(" title:"+doc.get("title"));
				System.out.print(" content:"+doc.get("content"));
				System.out.println();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		CreateIndexAndSearch cas = new CreateIndexAndSearch();
		cas.createIndex();
		cas.search("java");
	}

}

    以上代码中在创建索引后,对content域中对关键字“java”进行查询,由于在穿件索引时,我们只对title,和price进行了存储,没有对content进行存储,所以我们无法再还原conetnt:

运行结果如下:

doc编号:0 title:java content:null


你可能感兴趣的:(lucence索引的创建与简单的查询)