`

lucene增量索引的简单实现

阅读更多
用lucene来建立搜索程序,在检索的时候效率大大的提高了,但是却以建立索引为代价,建立索引本身就是个耗内存大、时间长的过程(数据量比较大,数据少何必用lucene来建立全文检索,个人拙见),从而索引的建立就是个瓶颈,如果我们建立好索引,然后每次更新数据后重新建立索引,无疑是不合理的,为什么不能在原先索引文件的基础上再把新更新的加在上面呢?增量索引就是在建完索引的后,将数据库的最后一条记录的ID存储起来,下次建立时候将这个ID拿到,从而可以把更新的数据拿到,并把这些更新数据的索引文件加在原先的索引文件里面,下面来看个简单的例子
数据库有两个字段id和title,话不多说,直接上代码,一看便知
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

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.index.IndexWriter;

public class Index {

    public static void main(String[] args) {
        try {
             Index index = new Index();
             String path = "d:\\index";//索引文件的存放路径
             String storeIdPath = "d:\\storeId.txt";//存储ID的路径
             String storeId ="";
             storeId = index.getStoreId(storeIdPath);
             ResultSet rs = index.getResult(storeId);
             index.indexBuilding(path, storeIdPath, rs);
             storeId = index.getStoreId(storeIdPath);
             System.out.println(storeId);//打印出这次存储起来的ID
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    
    public ResultSet getResult(String storeId) throws Exception{
         Class.forName("com.mysql.jdbc.Driver").newInstance();
         String url = "jdbc:mysql://localhost:3306/ding";
         String userName = "root";
         String password = "ding";
         Connection conn = DriverManager.getConnection(url,userName,password);
         Statement stmt = conn
             .createStatement();
         ResultSet rs = stmt
             .executeQuery("select * from newitem where id > '"+storeId+"'order by id");
        return rs;
     }

    public boolean indexBuilding(String path,String storeIdPath, ResultSet rs) {// 把RS换成LIST原理一样

        try {
             Analyzer luceneAnalyzer = new StandardAnalyzer();
            // 取得存储起来的ID,以判定是增量索引还是重新索引
            boolean isEmpty = true;
             try { 
                 File file = new File(storeIdPath);
                if (!file.exists()) {
                     file.createNewFile();
                 }
                 FileReader fr = new FileReader(storeIdPath);
                 BufferedReader br = new BufferedReader(fr);                 
                if(br.readLine()!= null) {
                     isEmpty = false;
                  }
                  br.close();
                  fr.close(); 
                 } catch (IOException e) { 
                    e.printStackTrace();
               }

             IndexWriter writer = new IndexWriter(path, luceneAnalyzer, isEmpty);//参数isEmpty是false表示增量索引
             String storeId = "";
            boolean indexFlag = false;
             String id;
             String title;
            while (rs.next()) {
                // for(Iterator it = list.iterator();it.hasNext();){
                 id = rs.getString("id");
                 title = rs.getString("title");
                 writer.addDocument(Document(id, title));
                 storeId = id;//将拿到的id给storeId,这种拿法不合理,这里为了方便
                 indexFlag = true;
             }
             writer.optimize();
             writer.close();
            if(indexFlag){
                // 将最后一个的ID存到磁盘文件中
                this.writeStoreId(storeIdPath, storeId);
             }
            return true;
         } catch (Exception e) {
             e.printStackTrace();
             System.out.println("出错了" + e.getClass() + "\n    错误信息为:   "
                    + e.getMessage());
            return false;
         }

     }


    public static Document Document(String id, String title) {
         Document doc = new Document();
         doc.add(new Field("ID", id, Field.Store.YES, Field.Index.TOKENIZED));
         doc.add(new Field("TITLE", title, Field.Store.YES,
                 Field.Index.TOKENIZED));
        return doc;
     }

    // 取得存储在磁盘中的ID
    public static String getStoreId(String path) {
         String storeId = "";
        try {
             File file = new File(path);
            if (!file.exists()) {
                 file.createNewFile();
             }
             FileReader fr = new FileReader(path);
             BufferedReader br = new BufferedReader(fr);
             storeId = br.readLine();
            if (storeId == null || storeId == "")
                 storeId = "0";
             br.close();
             fr.close();
         } catch (Exception e) {
             e.printStackTrace();
         }
        return storeId;
     }

    // 将ID写入到磁盘文件中
    public static boolean writeStoreId(String path,String storeId) {
        boolean b = false;
        try {
             File file = new File(path);
            if (!file.exists()) {
                 file.createNewFile();
             }
             FileWriter fw = new FileWriter(path);
             PrintWriter out = new PrintWriter(fw);
             out.write(storeId);
             out.close();
             fw.close();
             b=true;
         } catch (IOException e) {
             e.printStackTrace();
         }
        return b;
     }
}

这里代码写的比较简单,很多需要改进的地方,自己改进就行了,这里只是说明了增量索引的原理,望指正。
转自:http://hi.baidu.com/lewutian/blog/item/e98c63d3f10f7ed3a9ec9ae2.html


这只是一种实现增量索引的方式,此方法可行,但是有人说这个很烂,我还会继续关注增量索引的。
分享到:
评论
1 楼 xiaoxiao_0311 2012-03-01  
增量不是这么个建法吧,应该加一个时间字段,每次增加,修改什么的,时间字段要更新,这样添加增量字段时以时间为基准就可以了,你的以id,做个小实验还可以,但如果真的是实用,人家的修改过的记录你不能更新到你的索引中,当然也可以用做个例

相关推荐

    基于lucene技术的增量索引

    基于lucene技术的增量索引,实现索引的首次创建,动态增删改

    Lucene5学习之增量索引(Zoie)

    NULL 博文链接:https://iamyida.iteye.com/blog/2199848

    lucene分词搜索,增量索引及全量索引

    对数据进行分词,建立索引,增量及全量更新,定时更新

    【大搜集:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    lucene为数据库搜索建立增量索引.txt lucene数据库索引.txt 新闻系统全文检索的思绪.txt lucene学习笔记 1 .txt lucene学习笔记 2.txt lucene学习笔记 3 .txt lucene入门实战.txt Lucene 的学习 .txt ...

    lucene1.0.doc

    1. lucence的出现的原因和目的 2 2. lucence的元素组成与逻辑结构 2 2.1.lucence的元素 2 2.2查询逻辑 2 2.3入库逻辑 2 3. lucene建立索引的方式 3 ...6.3如何使lucence增量更新索引 4 7. lucene索引权重 5

    lucene.net实例

    lucene.net实现全文检索,有网上难以找到的增量索引、更新索引、删除索引实例,五万多条数据,建立索引、查询数据瞬间完成,速度之快难以想象。

    Lucene IndexApplication:使用lucene索引文本文档-开源

    增量索引与批量索引一样快。 Quartz.NET 引擎,用于搜索索引服务的自定义作业调度。 自动和安排 Lucene 搜索索引的构建。 用于记录系统消息的通用日志框架。 您可以为严重和非严重错误和消息配置设置。 排名搜索...

    LUCENE实例

    CreateLucene.java 增量生成索引 CreateLuceneAll.java 全量生成索引 CreateLuceneInter.java 按照时间区间生成索引 里面为参考代码,使用lucene-core-2.9.0.jar

    基于lucene搜索引擎的java源码

    这是基于lucene搜索引擎的java源码,里面数据库,包括建立索引,增量索引一应俱全,希望对大家有作用。

    利用Lucene.NET建立SQL数据库记录索引文件程序C#源代码(包含数据库结构)

    对初学使用dotlucent作站内检索的比较有帮助。 利用dotlucene为网站做的索引文件的应用程序。 数据库源是SQL Server,项目是...应用程序界面可以配置数据库链接,生成报告,定时执行增量索引,对单条索引进行更新操作。

    lucene全文检索-javademo.rar

    lukeall.jar---双击,然后选择索引文件的位置,就可以看见里面的文件了! hello.java 是对文档的内容检索 ...TeacherIndex 是采用ssh框架的模式对数据库里面的表创建索引、添加增量索引、检索文件操作

    Lucene.NET v3.0.3 DEMO范例程序(含PanGu分词)

    这是Lucene.NET v3.0.3 DEMO范例程序(含PanGu分词),用C#... 项目中还整理了一个后台任务线程监听范例,可以用作增量索引创建,但这个需要你自行加入相关具体的适合自己的代码…… 对了,这是基于.NET MVC的范例项目。

    解密搜索引擎技术实战-Lucene&java;精华版

    用简单的例子介绍了Lucene的最新应用方法,包括完整的搜索实现过程:从完成索引到搜索用户界面的实现。此外还进一步介绍了实现准实时搜索的方法,展示了Solr的用法以及实现分布式搜索服务集群的方法。最后介绍了在...

    1.解密搜索引擎技术实战:Lucene&Java;精华版(第3版)

    本书总结搜索引擎相关理论与实际解决方案,并给出了Java实现,其中利用了流行的开源项目Lucene和Solr,而且还包括...用简单的例子介绍了Lucene的应用方法,包括完整的搜索实现过程:从完成索引到搜索用户界面的实现。

    compass_src

    如果进行增量索引,就要增加一个字段,在数据更新时进行特殊的处理,删除时也不能直接删除数据,要等lucene删完索引它才能删除,这样Lucene对应用就非常不透明了。 三来不支持事务,如果建立索引过程中出现异常,...

    基于lucene4.3的知识图谱搜索引擎XunTa(一种用"知识点"来找人的搜人引擎).zip

     |---luceneIndex 索引文件夹,下面放置Lucene4.3版本的索引文件,存放了XXX条来自社交网站的“发言”数据。  |---XunTa XunTa项目源代码,可导入Eclipse(javaEE版)并运行。  |---readme.txt 您正在看的该说明...

    自己动手写搜索引擎(罗刚著).doc

    6.1.1 理解 Lucene 的索引库结构 146 6.1.2 设计一个简单的索引库 148 6.2 创建和维护索引库 149 6.2.1 创建索引库 149 6.2.2 向索引库中添加索引文档 149 6.2.3 删除索引库中的索引文档 151 6.2.4 更新索引库中的...

    解密搜索引擎技术实战Java精华版

    爬虫部分介绍了网页遍历方法和如何实现增量抓取,并介绍了从网页等各种格式的文档中提取主要内容的方法。自然语言处理部分从统计机器学习的原理出发,包括了中文分词与词性标注的理论与实现以及在搜索引擎中的实用等...

    jwSearchEngine V1.0.1站内搜索工具 升级版

    3、 新增定时增量索引功能 主要是为那些有自己独立服务器的站长,提供一个方便的制作站内搜索引擎的方法。 本产品完全免费 网址:http://jwsearchengine.sinaapp.com 网站测试地址: http://Jw.9zoe.com 本产品是...

    海量数据引擎SF1R.zip

    什么是SF1R SF1R是一个分布式的存储搜索一体化海量数据引擎。SF1R来自于iZENECloud团队多年...Suffix索引具备远高于传统索引的查询性能,缺点是构建的时候需要占用大量内存,并且无法支持增量。 标签:SF1R

Global site tag (gtag.js) - Google Analytics