今天小编接到一个任务,做网站搜索以及其内容显示,小编接到这个任务后就开始了解了Lucene,基于Java的全文索引/检索引擎——Lucene。首先简单介绍一下lucene。

    Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。

    Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,他是Lucene、Nutch 、Hadoop等项目的发起人。是他,把高深莫测的搜索技术形成产品,贡献给普罗大众;还是他,打造了目前在云计算和大数据领域里如日中天的Hadoop。他是某种意义上的盗火者,他就是Doug Cutting。

    下面小编给大家介绍一下这个项目的搭建。

     1.1 Lucene 3.0 环境搭建

    建立一个java 项目或者java web 项目。导入如下的包。
  • lucene-core-3.0.0.jar (这个是基本包)
  • IKAnalyzer3.2.8.jar   (分词器,可以很好的支持中文,本文的测试程序没有用到,后续搜索必不可少)
  • lucene-highlighter-3.0.0 (将搜索关键词进行高亮显示)
  • lucene-memory-3.0.0.jar 
    上面的包我已经上传到CSDN 分词器链接:http://download.csdn.net/download/shuaigexiaobo/994012

    1.2 Lucene的API

    索引库是一个目录,里面是一些二进制文件,就如同数据库,所有的数据也是以文件的形式存在文件系统中的。我们不能直接操作这些二进制文件,而是使用Lucene提供的API完成相应的操作,就像操作数据库应使用SQL语句一样。
对索引库的操作可以分为两种:管理与查询。管理索引库使用IndexWriter,从索引库中查询使用IndexSearcher。Lucene的数据结构为Document与Field。Document代表一条数据,Field代表数据中的一个属性。一个Document中有多个Field,Field的值为String型,因为Lucene只处理文本。
    我们只需要把在我们的程序中的对象转成Document,就可以交给Lucene管理了,搜索的结果中的数据列表也是Document的集合。
    索引库整体结构:
    
     

    索引库内部结构图:

    


    1.3. 第一个Lucene程序

    1.创建数据操作实体类
    
public class Product {
	private Integer id;
    private String name;
    private Double price;
    private String remark;
    //get 以及set 方法省略
}   

    2.添加Document对象
    // 相应的商品信息入库
	public void save(Product product) {
		File path =null;
		FSDirectory directory = null;
		IndexWriter index = null;
		Document doc = null;
		//指定 lucene 索引库,如果没有则新建一个
		path = new File("C:/index");
		try {
			directory  = FSDirectory.open(path);
			//指定分词器,不同的分词器分词结果不同,中文的后面会用到IK
			SimpleAnalyzer analyzer = new SimpleAnalyzer ();
			index = new IndexWriter(directory,analyzer, MaxFieldLength.LIMITED);
			//把product信息交给document对象
			doc = new Document();
			//在doc中仅仅支持String类型
			/**
			 * Stroe 指定当前的字段是否要存储到索引库中
			 *     Yes :需要存储    No:不需要存储,以后搜索出来的数据没有该字段
			 * Index(分词),指定当前的字段是否要进行索引
			 *     NOT_ANALYZED:要创建索引(以后可以通过ID来搜索当前数据),不进行分词   ,当前数据整个一个字段将是一个索引
			 *     ANALYZED:建立索引,并且支持分词,这样一个字段就可以分成多个字段(Term),所以一个FIeld可以拆分成多个Term。
			 *     NO: 不建索引,这样以后就不能通过价格字段来进行搜索该数据
			 */
			doc.add(new Field("id",product.getId().toString(),Store.YES,Index.NOT_ANALYZED));
			doc.add(new Field("name",product.getName(),Store.YES,Index.ANALYZED));
			doc.add(new Field("price",product.getPrice().toString() ,Store.YES,Index.NO));
			doc.add(new Field("remark",product.getRemark(),Store.NO,Index.ANALYZED));
			index.addDocument(doc);
			//如果没有提交,在关闭indexWriter的时候会自动提交。
			index.commit();
		} catch (IOException e) {
			try {
				index.rollback();
				throw new RuntimeException();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally{
			try {
				index.close();
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
     3.添加测试数据
   
public class AddDocument {

	public static void main(String[] args) {
		AddDocument add = new AddDocument();
		add.save(new Product(1,"java",12.12,"java developer"));

	}

    4. 在C盘下有index文件,里面内容如下:
   
     _0 .cfs 为索引文件。
     今天的博客到此结束,希望大家能多多关注小编。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐