lucene简单介绍

什么是lucene

lucene是一堆的jar包,我们可以使用lucene做一个类似于百度、京东的搜索引擎。为了更加方便的搜索,并且不会因为数据量的加大而明显的加长搜索时间。

常见的搜索算法

  1. 顺序扫描法(正排索引算法): 查询时带着关键字,从数据的开始到结尾,全部查询一遍,将所有带关键字的数据都查询出来,然后进行一个排列,排序,将最接近搜索的数据排在最前。
    当数据量小的时候,很快,但是数据量很大,海量数据的时候,全部查询出来是不太可能的,太浪费时间。
    缺点:查询速度慢、随着数据量的不断加大,搜索时间会变得越来越长。
    优点:准确率高。
  2. 倒排索引算法(全文检索算法): 将数据库中的所有信息查询出来,然后进行切分词,生成目录,然后将要存储的数据放在文档中,数据库中的一列数据就是一个文档。索引和文档组成索引库,检索时,先查询到索引,然后通过索引与文档之间的联系,查询数据信息。数据之间,会有一个默认的打分效果,会把与搜索内容最为相似的数据排在最前面。
    缺点:生成的文档占空内存空间,是一种空间换时间的算法
    优点:查询效率高,不会因为数据量的大家而出现明显的时间延迟。
    举例:字典:把所有的字偏旁部首都取出来,组成目录,目录与后面的内容有联系, 通过目录能快速的找到字的详细

创建数据库中(book)表索引目录实例

 // 1. 创建索引的目录
FSDirectory directory = FSDirectory.open(new File("d:/sxkdj/lucene"));
// 2.  分词器  StandardAnalyzer是lucene的标准分词器,对于英语支持的很好,但是会
//汉语一个字一个字的分开,不会有语法逻辑,这里使用IKAnalyzer分词器
// Analyzer analyzer = new StandardAnalyzer();
Analyzer analyzer = new IKAnalyzer();
// 查询的所有内容
BookDao bookDao = new BookDao();
List<Book> bookList = bookDao.findAll();
//  吧内容放到文档对象当中
List<Document> documentList = new ArrayList<>();
for (Book book : bookList) {
     Document document = new Document();
//  根据Field域的类型的不同,对查询出的数据做分类
// 有的需要在索引中保存,有的需要 建立索引 有的需要分词
   /**
   * 注意 :如果一列数据是可以通过区间范围查找的,则需要建立索引
   * 此处 :
   *  id: 不需要分词  需要保存  需要建立索引
   *  name: 需要分词  需要保存  需要建立索引
   *  price : 不需要分词  需要保存  需要建立索引
   *  pic : 不需要分词  需要保存  不需要建立索引
   *  desc : 需要分词  不需要保存  需要加你了索引
   */
StringField idField = new StringField("id",String.valueOf(book.getId()), Field.Store.YES);
TextField nameField = new TextField("name",book.getName(), Field.Store.YES);
StringField priceField = new StringField("price",String.valueOf(book.getPrice()), Field.Store.YES);
StoredField picField = new StoredField("pic",book.getPic());
TextField descField = new TextField("desc",book.getDesc(), Field.Store.NO);

document.add(idField);
document.add(nameField);
document.add(priceField);
document.add(picField);
document.add(descField);
documentList.add(document);
}
// 3. 获取索引 输出流对象
//  索引输出流对象的配置文件对象
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);

IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);

//  把文档对象写入的索引库中
for (Document document : documentList) {
	indexWriter.addDocument(document);
}
//  最关键的一步  提交操作
indexWriter.commit();
//  关闭资源
indexWriter.close();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值