Lucene 搜索 一个测试程序
今天小编接到一个任务,做网站搜索以及其内容显示,小编接到这个任务后就开始了解了Lucene,基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引
·
今天小编接到一个任务,做网站搜索以及其内容显示,小编接到这个任务后就开始了解了Lucene,基于Java的全文索引/检索引擎——Lucene。首先简单介绍一下lucene。
Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
对索引库的操作可以分为两种:管理与查询。管理索引库使用IndexWriter,从索引库中查询使用IndexSearcher。Lucene的数据结构为Document与Field。Document代表一条数据,Field代表数据中的一个属性。一个Document中有多个Field,Field的值为String型,因为Lucene只处理文本。
我们只需要把在我们的程序中的对象转成Document,就可以交给Lucene管理了,搜索的结果中的数据列表也是Document的集合。
索引库整体结构:
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
- lucene-core-3.0.jar 链接:http://download.csdn.net/download/shuaigexiaobo/9940125
- IKAnalyzer3.2.8.jar 链接:http://download.csdn.net/download/shuaigexiaobo/9940127
- lucene-highlighter-3.0.0 链接:http://download.csdn.net/download/shuaigexiaobo/9940134
- lucene-memory-3.0.0.jar 链接:http://download.csdn.net/download/shuaigexiaobo/9940155
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 为索引文件。
今天的博客到此结束,希望大家能多多关注小编。
更多推荐
所有评论(0)